2016-06-25 4 views
0

Grundsätzlich schreibe ich ein Programm in Java, wo ich eine Zeichenfolge in einem der drei Buckets kategorisieren muss.Java Reg Exp für Word nicht gefolgt von einem anderen Wort

  • Kategorie 1 - String mit den beiden 'UND' und 'und nicht'
  • Kategorie 2 - String mit 'und nicht'
  • Kategorie 3 - String mit 'UND'

Ich brauche ein Regex, um die Zeichenfolge mit AND gefolgt von NOT wenn nicht zu überspringen.

A AND B AND NOT C - Fail 
A AND B AND C - Fail 
A AND NOT B AND NOT C - Pass 

Unten finden Sie Beispielcode-Ausschnitt

public static void main(String[] args) { 
    String X = "A AND B AND C AND D AND NOT E"; 
    String Y = "A AND NOT C "; 
    String Z = "A AND B AND D"; 
    ArrayList<String> sampleString=new ArrayList<String>(Arrays.asList(X,Y,Z)); 

    //Category 1 - String with both 'AND' and 'AND NOT' 
    //Category 2 - String with 'AND NOT' only 
    //Category 3 - String with 'AND' only 

    for(String s:sampleString){ 
     if(s.contains("AND") && s.contains("NOT")){ 
      System.out.println("Category 1 -"+s); 
     } 
     // This condition is invalid - I need some regex to match this condition. I need to consider only AND followed by NOT if not skip 

     if(s.contains("AND NOT") && !s.contains("AND")){ 
      System.out.println("Category 2 - "+s); 
     } 
     if(s.contains("AND") && !s.contains("NOT")){ 
      System.out.println("Category 3 - "+s); 
     } 
    } 

OUTPUT -

Category 1 -A AND B AND C AND D AND NOT E 
Category 1 -A AND NOT C 
Category 3 - A AND B AND D 

ich einige regex Fragen versucht, aber nicht meins nicht lösen. Ich versuchte mit unten

String regex="AND(?!\\s+NOT)"; 

public static void main(String args[]){ 
     String x= "A AND B AND C AND NOT D"; 
     String regex="AND(?!\\s+NOT)"; 
     if(Pattern.compile(regex).matcher(x).find()){ 
      System.out.println("X MATCHED"); 
     } 
    } 
//Returns - X MATCHED 

Jede Hilfe würde sehr geschätzt werden!

+0

Mit 'sonst if' helfen, die kollidierenden Bedingungen zu entfernen. – 4castle

+0

Sie haben ein Programmierproblem. Sie entscheiden, es mit regulären Ausdrücken zu lösen. Jetzt haben Sie zwei Programmierprobleme. –

+0

Oh ja. versuchen, eine Lösung für beide Probleme zu finden! – Cyborgz

Antwort

1

Die folgende Regex-Schleife find() bestimmt die Kategorie und gibt 0 zurück, wenn die Eingabe keiner der aufgelisteten Kategorien entspricht.

private static int categorize(String input) { 
    Matcher m = Pattern.compile("(?i)\\bAND(\\s+NOT)?\\b").matcher(input); 
    boolean foundAndNot = false, foundAnd = false; 
    while ((! foundAndNot || ! foundAnd) && m.find()) 
     if (m.start(1) != -1) 
      foundAndNot = true; 
     else 
      foundAnd = true; 
    return (foundAndNot ? (foundAnd ? 1 : 3) 
         : (foundAnd ? 2 : 0)); 
} 

Die linke Seite der && Bedingung in der while Schleife ist nur ein Kurzschluss, wobei die Schleife früh zu beenden, wenn die beide zu finden sind.

Die (?i) in der Regex ist für die Herstellung von Groß-und Kleinschreibung, die Regex Implementierung überstrahlt.

Die m.start(1) != -1 Prüfung soll sehen, ob die Erfassungsgruppe übereinstimmte, d. H. Um zu sehen, ob die Übereinstimmung das NOT Wort enthielt.

TEST

System.out.println(categorize("A AND B AND NOT C"));  // prints 1 
System.out.println(categorize("A AND B AND C"));   // prints 3 
System.out.println(categorize("A AND NOT B AND NOT C")); // prints 2 
System.out.println(categorize("A OR B OR NOT C"));  // prints 0 
+0

Perfekt gearbeitet. Danke für das nette Schnipsel !! Ich habe meinen Code stundenlang für diese Lösung gebrochen. Danke noch einmal!! – Cyborgz

1

Try this:

boolean hasBoth = x.matches("(?=.*AND NOT).*AND(?! NOT).*"); 
boolean onlyAnd = x.matches("(?!.*AND NOT).*AND.*"); 
boolean onlyAndNot = x.matches("(?!.*AND(?! NOT)).*AND NOT.*"); 
+0

Wenn meine Zeichenfolge "A UND B UND C UND NICHT D" ist, ist der dritte boolesche Wert "onlyAndNot" "True" anstelle von "False". wie auch immer, danke für deine Zeit in meiner Antwort! – Cyborgz

+1

@Cyborgz OK! Fest. Versuche es jetzt. – Bohemian

+0

perfekte Lösung! Funktioniert wie erwartet !! – Cyborgz

Verwandte Themen