Newsgroup: it.comp.www.asp
Titolo: RegEx per troncamento stringa su parole intere

Non essendo molto esperto di RegExp vorrei sapere se avete già qualche
pattern pronto che tronchi una stringa dopo (o ENTRO) tot caratteri (di
qualunque tipo), al primo spazio o virgola o punto o punto e virgola che
trova.
In pratica senza spezzare le parole. Forse ENTRO tot caratteri sarebbe
meglio.. effettuando quindi la procedura di ricerca della parola intera
all'inditetro, dentro al range specificato.
-- 
:: Massimiliano Mattei
:: Project Leader
:: EVA Group :: 
www.evagroup.net
:: Soluzioni extranet :: e-business :: corporate portal


Microsoft 
ASP.NET/.NET
 MVP
http://www.aspitalia.com/
 Enjoy the .NET community!
http://www.dev2dev.it/
 La rete ha connesso nuove particelle!
http://www.extensible.it/
 XML and beyond

Si per ASP classico hai ragione. Ti ringrazio, dopo verifico... :)


ciò che è tra i caratteri \b (boundary) indica che ciò che viene "matchato"
deve essere una o più parole intere. In questo caso indichiamo, >qualsiasi
carattere (.) da un minimo di uno ad un massimo di 28 ({1,28}). Ovviamente
dovrete cambiare 28 col numero che voi necessitate.
Per come è scritta a me sembra che vengano matchate le parole che vanno da
1-28 caratteri e non tutte le parole fino ad un totale di 28 caratteri.
Sto cercadno di sistemarla ma a fatica... credo che alla fine sia più veloce
una piccola funzione vbscript dato che non riesco a trovare un modo...
Qui c'è un ottimo link se vi interessa cimentarvi:
http://www.allfreetech.com/ShowMain.asp?MainID=90
E questo è una funzioncina per ottenere il risultato di match in una
stringa:
Function strHTML_STRIP(strInput,intStrip)
Dim objRegExp, objMatch, strTemp
' #### strInput contiene la stringa originale e intStrip il n. max di
caratteri da usare nel pattern (come??)
    strHTML = ""
    If strInput & "" <> "" Then
      Set objRegExp = New RegExp
      objRegExp.Global = True
      objRegExp.IgnoreCase = True
      objRegExp.Pattern  = "\b\w+\b"
      Set objMatch = objRegExp.Execute(strInput)
      If objMatch.Count > 0 Then strTemp = objMatch.Item(0)
      End If
      Set objMatch = Nothing
      Set objRegExp = Nothing
      strHTML_STRIP = strTemp
   End If
End Funciton


 1-28 caratteri e non tutte le parole fino ad un totale di 28 caratteri.
no, prende i primi x char senza troncare. la uso da diverso tempo, grazie a
Cristian, su ASPItalia.com, in tutti gli abstract.
gli unici problemi ci sono con la punteggiatura o il codice HTML, ma siccome
č pensata per plain text, fa il suo lavoro egregiamente in questo ambito.


Hai ragione :) Mi sa che a forza di fare prove di regexp mi sono rinco...
A chi serve eccola qua.. è parte di una funzione più complessa, basta che
dichiariate le varibili.
strInput è la stringa originale, intStrip è il n.max di char.
 Case "HTML_STRIP"
  If Len(strInput) > intStrip Then
   Set objRegExp = New RegExp
   objRegExp.Global = True
   objRegExp.IgnoreCase = True
   objRegExp.Pattern  = "^(\b.{1," & intStrip & "}\b)"
   Set objMatch = objRegExp.Execute(strInput)
   If objMatch.Count > 0 Then strTemp = RTrim(objMatch.Item(0).Value) &
"..."
   Set objMatch = Nothing
   Set objRegExp = Nothing
  Else
   strTemp = strInput
  End If


Purtroppo c'è ancora un problema che è quello di includere i ritorni a
capo.... se qualcuno ha qualche idea.. ho provato con:
"^(\b.\n\r\f{1," & intStrip & "}\b)" ma non va


 "^(\b.\n\r\f{1," & intStrip & "}\b)" ma non va
per questo c'era (s) nel pattern originale.
con VBS (ma anche con la classe RegEx del .NET Framework) puoi specificare
anche da codice come deve comparsi.
se la memoria mi assiste, con VBS basta impostare re.MultiLine = false (o il
contrario :D)


La (?s) l'ho dovuta levare perchè nella versione vbscript non andava
purtroppo..
Si era multiline infatti, anche se pare che non tutte le versioni di
vbscript la supportino. Non so se è per questo (a me non da errori di sorta)
ma di fatto, anche con multiline non va... è un osso duro...
  intStrip= 28
  strInput = "ziofestewr asdfk" & vbNewLine & "ifdas sdf " & vbCrLf &
"hsdfhds sid r"
  If Len(strInput) > intStrip Then
   Set objRegExp = New RegExp
   objRegExp.Global = True
   objRegExp.IgnoreCase = True
   objRegExp.Multiline = True
   objRegExp.Pattern  = "^(\b.{1," & intStrip & "}\b)$"
   Set objMatch = objRegExp.Execute(strInput)
   If objMatch.Count > 0 Then strTemp = RTrim(objMatch.Item(0).Value) &
"..."
   Set objMatch = Nothing
   Set objRegExp = Nothing
  Else
   strTemp = strInput
  End If


Ho risolto.
Non occorre neanche multiline
Questo è l'equivalente della (?s)  [\s\S] (almeno credo...)
E non occorre la \b iniziale dato che il troncamento avviene a destra..
objRegExp.Pattern  = "[\s\S]{1," & intStrip & "}\b"
Grazie cmq dei vari spunti
