2009-03-23 5 views
7

Wie schreibe ich ein Muster (Java), das zu einer beliebigen Zeichenfolge außer einer bestimmten Liste von Wörtern passt?Java Muster, das mit einer beliebigen Zeichenfolge außer einer gegebenen Liste übereinstimmt

Ich muss herausfinden, ob ein gegebener Code einen Text hat, der von Tags umgeben ist, neben einer bestimmten Liste von Wörtern. Zum Beispiel möchte ich prüfen, ob neben "eins" und "zwei" noch andere Wörter von dem Tag umgeben sind.

"This is the first tag <span>one</span> and this is the third <span>three</span>" 

Das Muster soll die obige Zeichenfolge übereinstimmen, weil das Wort „drei“ durch den Tag umgibt und ist nicht Teil der Liste der genannten Worte („eins“, „zwei“).

+0

Erkennen Sie, dass es einen so wesentlichen Unterschied zwischen Ihrer Frage vs. vor Ihrer Bearbeitung gibt, dass jeder, der sie vor der Bearbeitung beantwortet, im Wesentlichen Zeit verschwendet hat? Versuchen Sie beim nächsten Mal von Anfang an absolut klar zu sein. Niemand hier hat eine Kristallkugel oder kann deine Gedanken lesen. – Tomalak

Antwort

2

verwenden:

if (!Pattern.matches(".*(word1|word2|word3).*", "word1")) { 
    System.out.println("We're good."); 
}; 

Sie überprüfen, dass das Muster tut nicht mit der Zeichenfolge übereinstimmen.

+0

Danke für Ihre Antwort, aber das wird nicht funktionieren. Ich fügte der Beschreibung des Problems weitere Informationen hinzu. – Mario

7

Look-Ahead kann dies tun:

\b(?!your|given|list|of|exclusions)\w+\b 

Spiele

  • eine Wortgrenze (Start-of-Wort)
  • nicht gefolgt von einem "Ihr", "gegeben" , "Liste", "von", "Ausschlüsse"
  • gefolgt von mehreren Wortzeichen
  • gefolgt von einer Wortgrenze (Ende des Wortes)

In der Tat stimmt dies mit jedem Wort überein, das nicht ausgeschlossen ist.

4

Dies sollte Ihnen den Anfang machen.

import java.util.regex.*; 

// >(?!one<|two<)(\w+)/ 
// 
// Match the character “>” literally «>» 
// Assert that it is impossible to match the regex below starting at this position (negative lookahead) «(?!one|two)» 
// Match either the regular expression below (attempting the next alternative only if this one fails) «one» 
//  Match the characters “one<” literally «one» 
// Or match regular expression number 2 below (the entire group fails if this one fails to match) «two» 
//  Match the characters “two<” literally «two» 
// Match the regular expression below and capture its match into backreference number 1 «(\w+)» 
// Match a single character that is a “word character” (letters, digits, etc.) «\w+» 
//  Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+» 
// Match the characters “/” literally «</» 
List<String> matchList = new ArrayList<String>(); 
try { 
    Pattern regex = Pattern.compile(">(?!one<|two<)(\\w+)/"); 
    Matcher regexMatcher = regex.matcher(subjectString); 
    while (regexMatcher.find()) { 
     matchList.add(regexMatcher.group(1)); 
    } 
} catch (PatternSyntaxException ex) { 
    // Syntax error in the regular expression 
} 
+0

Ich denke, Sie möchten vielleicht die "Eins" und "Zwei" im Muster zu "Eins <" und "Zwei <" ändern, so dass Sie immer noch Dinge zuordnen können, die mit einem der beiden beginnen. –

+0

@Marty - du hast Recht. Ich werde die Antwort aktualisieren. –

Verwandte Themen