2016-04-10 24 views
1

Ich habe eine Zeichenfolge wieExtrahieren von Variablen aus der mathematischen Gleichung

a + (b * 6) < = Katze * 45 & & cat = Hund

Ich versuche, die Variablen zu extrahieren a, b, cat, dog . Unten ist mein Code.

 Set<String> varList = null; 
     StringBuilder sb = null; 
     String expression = "a+(b * 6) <= cat*45 && cat = dog"; 
     if (expression!=null) 
     { 
      sb = new StringBuilder(); 

      //list that will contain encountered words,numbers, and white space 
      varList = new HashSet<String>(); 

      Pattern p = Pattern.compile("[A-Za-z\\s]"); 
      Matcher m = p.matcher(expression); 

      //while matches are found 
      while (m.find()) 
      { 
       //add words/variables found in the expression 
       sb.append(m.group()); 
      }//end while 

      //split the expression based on white space 
      String [] splitExpression = sb.toString().split("\\s"); 
      for (int i=0; i<splitExpression.length; i++) 
      { 
       varList.add(splitExpression[i]); 
      } 
     } 

     Iterator iter = varList.iterator(); 
     while (iter.hasNext()) { 
      System.out.println(iter.next()); 
     } 

Output Ich erhalte ist:

ab 
cat 
dog 

Erforderliche Ausgabe:

a 
b 
cat 
dog 

hier der Fall ist, können die Variablen oder nicht durch Leerzeichen getrennt werden. Wenn Leerraum vorhanden ist, ist die Ausgabe gut. Aber wenn die Variablen nicht durch Leerzeichen getrennt sind, bekomme ich falsche Ausgaben. Kann mir jemand die richtige Pattern vorschlagen?

+1

Check: - https: // regex101 .com/r/lD2qE2/1 – rock321987

+0

Interessante Frage :) –

Antwort

2

Warum verwenden Sie eine Regex find() Schleife, um Wörter zu extrahieren, dann verketten sie alle in eine Zeichenfolge, nur um diese Zeichenfolge wieder zu teilen?

Verwenden Sie einfach die von der Regex gefundenen Wörter.

Nun, das heißt, nach dem Entfernen von Leerzeichen (\\s) aus dem Ausdruck und damit es gesamte Wörter übereinstimmen (+), natürlich.

Pattern p = Pattern.compile("[A-Za-z]+"); 
Matcher m = p.matcher(expression); 
while (m.find()) 
{ 
    varList.add(m.group()); 
} 
+0

Danke, genau, was ich brauchte :) –

1

Wenn Ihre Variablen einfach eine alphabetische Zeichenkette sind, können Sie einfach mit einer einfachen Regex wie dieser nach ihnen suchen.

Regex:[A-Za-z]+

Regex101 Demo

+1

Danke für die visuelle Demo –

0

Diese Regex sollte funktionieren (variable name can start with uppercase or lowercase and can then contain digit(s), underscore, uppercase and lowercase)

\b[A-Za-z]\w*\b 

Regex Demo

Java Cod e

Set<String> set = new HashSet<String>(); 
String line = "a+(b * 6) <= cat*45 && cat = dog"; 
String pattern = "\\b([A-Za-z]\\w*)\\b"; 

Pattern r = Pattern.compile(pattern); 
Matcher m = r.matcher(line); 

while (m.find()) { 
    set.add(m.group()); 
} 
System.out.println(set); 

Ideone Demo

1

Ich glaube, Sie regexp mit "[A-Za-z] +" ersetzen soll. ich simuliert es nur in Python

>>> re.findall('[A-Za-z]+', 'a+(b * 6) <= cat*45 && cat = dog') 
['a', 'b', 'cat', 'cat', 'dog'] 
>>> 

Also das nächste, legte die Ergebnisliste in einen Satz:

>>> rs = set(re.findall('[A-Za-z]+', 'a+(b * 6) <= cat*45 && cat = dog')) 
>>> for w in rs: 
...  print w, 
... 
a b dog cat 
>>> 
+0

auch 'set' Datenstruktur zum Finden aller einzigartigen Elemente – rock321987

+0

@ rock321987 ja, das ist die nächste. –

0

Vollarbeits Code

public static void main(String[] args) { 
    Set<String> varList = null; 
    StringBuilder sb = null; 
    String expression = "a+(b * 6) <= cat*45 && cat = dog"; 
    if (expression!=null) 
    { 
     sb = new StringBuilder(); 

     //list that will contain encountered words,numbers, and white space 
     varList = new HashSet<String>(); 

     Pattern p = Pattern.compile("[A-Za-z\\s]+"); 
     Matcher m = p.matcher(expression); 

     //while matches are found 
     while (m.find()) 
     { 
      //add words/variables found in the expression 
      sb.append(m.group()); 
      sb.append(","); 
     }//end while 

     //split the expression based on white space 
     String [] splitExpression = sb.toString().split(","); 
     for (int i=0; i<splitExpression.length; i++) 
     { 
      if(!splitExpression[i].isEmpty() && !splitExpression[i].equals(" ")) 
       varList.add(splitExpression[i].trim()); 
     } 
    } 

    Iterator iter = varList.iterator(); 
    while (iter.hasNext()) { 
     System.out.println(iter.next()); 
    } 
} 
Verwandte Themen