2017-01-09 5 views
2

ich mit ohne eine besondere Bedingung ein Problem haben. Ich erstelle bereits ein Beispiel in dieser LINK.Regex: Wie kann man vermeiden, ein Wort in einer Zeichenkette auf einer Bedingung passenden

Wenn ich Liste der Satz wie folgt aus:

X-MAS TREE //it should be excluded because match my dictionary 
BLA BLA TREE 
XMAS TREE 
X-MASTREE 
X-TREE 
X-MASTREE 

Und ich habe Wörterbuch, dass WEIHNACHTSBAUM Synonyme hat: WEIHNACHTSBAUM, X-MasTree, X-Baum,. Und ich muss alle Synonymewörter in mein Wörterbuchwort ändern.

Ausschließen X-MAS TREE? Weil all die regex wird mit X-MAS TREE Wenn ich mit Stichwort TREE suchen ersetzen werden, wird es Endlosschleife, weil X-MAS TREETREE

hat ich schon viele Kombination versucht, aber nicht funktioniert:

\b(XMAS TREE|X\-MASTREE|X\-TREE|TREE|(?!X\-MAS TREE)\b 
\b(XMAS TREE|X\-MASTREE|X\-TREE|(?!X\-MAS \s)TREE)\b 
\b(XMAS TREE|X\-MASTREE|X\-TREE|((?!X\-MAS)|\w*)TREE)\b 
\b(XMAS TREE|X\-MASTREE|X\-TREE|(?:(?!X\-MAS))TREE)\b 

EDIT

Ich brauche Grenzen (aus irgendeinem Grund), weil ich die Regex in meinem Code, mit Schleifenbildung, und müssen es für ein anderes Wörterbuch verwenden, warum, für diesen Fall brauche ich spezielle Bedingung (ohne die Struktur zu ändern Code, bearbeiten nur die Regex TREE)

+0

Vielleicht die Auflistung aller unerwünschten Fälle als Lookbehinds? ['\ b (?

+0

die ersten drei Regex, ich brauche es, nur X-MAS TREE, die ausgeschlossen werden müssen. Der andere ist richtig. –

+0

Sie können versuchen mit: ['/^([^X].+|X[^-].+|X-[^M].+|XM[^A].+|X-MA[^S ]. + | X-MAS [^]. + | X-MAS [^ T]. + | X-MAS T [^ R]. + | X-MAS TR [^ E]. + | X-MAS TRE [^E]. +)/Gm'] (http://regexr.com/3f17o) – Faibbus

Antwort

1

Wenn Sie ein ganzes Wort TREE übereinstimmen soll, die nicht mit X-MAS und ein Leerzeichen vorangestellt ist, können Sie eine negative Lookbehind (?<!X-MAS\\s) (oder, um sicherzustellen, dass die X-MAS ist ein ganzes Wort, (?<!\\bX-MAS\\s)) verwenden:

String pat = "\\b(?<!X-MAS\\s)TREE\\b"; 

Siehe regex demo.wenn es auch

kann mehr als 1 Leerzeichen sein, sagen wir, von 1 bis 10, können Sie eine Begrenzung quantifier{1,10} nach \s hinzufügen, um sicherzustellen, mehr als 1 Leerzeichen ist nach wie vor einen Anteil von:

String pat = "\\b(?<!X-MAS\\s{1,10})TREE\\b"; 

Hier, auch wenn es keine oder bis zu 10 Leerzeichen zwischen X-MAS und TREE gibt, wird die negative Bedingung (die so genannte constrained-width negative lookbehind) funktionieren.

Siehe this Java demo.

2

du versuchen:

^(?!X-MAS\s+TREE\s*)(?=.*TREE).*$ 

Explanation

  1. ^behauptet Position am Anfang einer Zeile
  2. negative Vorschau (?!X-MAS\s+TREE\s*)
  3. \ s + entspricht jedes Leerzeichen (gleich [\ r \ n \ t \ f \ v])
  4. positive Vorschau (?=.*TREE) Assert dass der Regex unten übereinstimmt. *
  5. behauptet $ Position an das Ende einer Zeile

Ihr Kommentar Struktur abzudecken, können Sie eine negative Blick hinter

\b.*(?<!X-MAS)TREE\b 

versuchen 210

+0

Ich muss meinen Strukturcode verwenden, weil ich aus irgendeinem Grund meine Struktur nicht ändern kann. Diese Antwort funktioniert ordnungsgemäß, wenn ich meinen Fall ohne zukünftiges Bedürfnis ausprobiere. –

+0

Können Sie bitte ausarbeiten, was meinen Sie mit Ihrem Strukturcode? –

+0

"\ b (Wort | Wort | Wort | ... | Wort) \ b" Ich benutze diese Art von Struktur –

Verwandte Themen