2016-04-10 3 views
1

Я строка какИзвлечение переменных из математического уравнения

а + (Ь * 6) < = кошка * 45 & & кот = собака

Я пытаюсь извлечь переменные a, b, cat, dog , Ниже мой код.

 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()); 
     } 

Выход я получаю:

ab 
cat 
dog 

Требуемая мощность:

a 
b 
cat 
dog 

Вот случай, переменные могут или не могут быть разделены пробелом. Когда есть пробел, выход хорош. но если переменные не разделены пробелом, я получаю неправильные выходы. Может ли кто-нибудь предложить мне Pattern?

+1

Проверьте: - https: // regex101 ,com/r/lD2qE2/1 – rock321987

+0

Интересный вопрос :) –

ответ

2

Зачем использовать цикл regex find() для извлечения слов, а затем объединить их все в строку, чтобы снова разбить эту строку?

Просто используйте слова, найденные регулярным выражением.

Ну, то есть, после удаления пробела (\\s) из выражения и его соответствия целым словам (+), конечно.

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

Спасибо, именно то, что мне нужно :) –

1

Если ваши переменные - это просто строка алфавитов, вы можете просто их искать, используя простое регулярное выражение.

Regex:[A-Za-z]+

Regex101 Demo

+1

Спасибо за визуальную демонстрацию –

0

Это регулярное выражение должно работать (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 е

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

Я считаю, что вы должны заменить регулярное выражение с "[A-Za-Z] +". я просто моделируется его в Python

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

Так что следующий, поместите список результатов в наборе:

>>> 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

также используйте структуру данных 'set' для поиска всех уникальных элементов – rock321987

+0

@ rock321987 да, это следующий. –

0

Полностью рабочий код

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()); 
    } 
} 
Смежные вопросы