2016-05-05 9 views
1

Angenommen, der zu durchsuchende Text ist pqr.Wie kann man nach Text suchen, der nicht Teil einer URL ist?

"http://abc.zzz/pqr/xyz"  -> Should not match 
"/pqr/"      -> Should Match 
"pqr"       -> Should Match 
"http://abc.zzz/pqr/pqr/"  -> Should not match 
"http://abc.zzz/pqr/pqr/ pqr" -> Should match the last "pqr" 
"www.pqr.zzz"     -> Should not match 

ich die folgende regex versucht, mit,

((?:(?:(?:https?|ftp|file|mailto):)|www)[^ ]+?)?(pqr) 

Ich sah dann für group 1, wenn es leer ist, dann wurde ich es als Spiel betrachten. Aber das scheitert an http://abc.zzz/pqr/pqr/

Hilfe hier zu erkennen, wenn der Text nicht Teil einer URL ist?

Der schlimmste Fall ist, dass ich zuerst alle URLs erkennen und dann die Start- und Endindizes der übereinstimmenden URLs speichern soll. Versuchen Sie dann, pqr übereinzustimmen und alle diejenigen auszuschließen, die Teil der URL sind. Ich habe überlegt, ob es etwas gibt, das besser gemacht werden kann.

+0

Wofür brauchen Sie 'pqr'? Durch etwas ersetzen? Der beste Weg ist, die URL und dann den 'pqr' (in einer Alternationsgruppe) zu finden. –

+0

In meinem Fall ist 'pqr' selbst ein regulärer Ausdruck, der nicht immer Teil einer URL sein kann. – pratZ

+0

Der schlimmste Fall ist, dass ich zuerst alle URLs erkennen und dann die Start- und Endindizes der übereinstimmenden URLs speichern soll. Dann versuche, 'pqr' zu finden und schließe alle aus, die Teil der URL sind. – pratZ

Antwort

2

Wenn Sie Java verwenden, können Sie das Constrained-Width-Lookbehind nutzen, das von der Java-Regex-Engine unterstützt wird. Es bedeutet, dass Sie {n,m} begrenzenden Quantifizierer in dem Muster verwenden können. Gerade jetzt, Java 8 supports even * and + quantifiers inside a lookbehind (obwohl inoffiziell), aber das ist ein Fehler und wird wahrscheinlich in der nächsten Version behoben werden. So können Sie etwas Bereich verwenden, sagen 0 to 1000 (wie der Link nicht wahrscheinlich ist, mehr als 1 K Symbole enthalten, aber Sie können es auf die tatsächliche Situation anpassen):

(?<!(?:(?:https?|ftp|file)://|mailto:)(?:www\.)?\S{0,1000})(?<!\bwww\.\S{0,1000})pqr 

Siehe regex demo

Die Der erste Lookbehind (?<!(?:(?:https?|ftp|file)://|mailto:)(?:www\.)?\S{0,1000}) überprüft, ob der pqr keine vollständige URL vorangestellt ist, und (?<!\bwww\.\S{0,1000}) lookbehind überprüft, ob pqr nicht mit www. vorangestellt ist.