2014-07-02 5 views
4

У меня проблемы с регулярными выражениями Java. У меня есть строка, как этотСплит Java-строка

a + 4 * log(3/abs(1 – x)) + sen(-b/4 + PI) 

и мне нужно разделить это в следующих лексем:

{"a", "+", "4", "*", "log", "(3/abs(1 - x))", "+", "sen", "(-b/4 + PI)"} 

Любая идея?

Я попытался это PHP регулярное выражение, но по какой-то причине он не будет работать на Java

[a-z]+(\((?>[^()]+|(?1))*\))|[a-z]+|\d+|\/|\-|\*|\+ 
+3

Не следует использовать регулярное выражение. –

+0

Пожалуйста, покажите, что вы пробовали. – Matsemann

+0

Что я должен использовать вместо этого? – FrankTominc

ответ

4

Учесть все против Расщепление

Matching и расщепление имеют две стороны одной медали. Это довольно сложно, потому что Java не поддерживает рекурсию, и у нас есть несколько вложенных круглых скобок. Но это следует сделать трюк:

Java

\(.*?\)(?![^(]*\))|[^\s(]+ 

demo См.

Для перебора всех матчей:

Pattern regex = Pattern.compile("\\(.*?\\)(?![^(]*\\))|[^\\s(]+"); 
Matcher regexMatcher = regex.matcher(subjectString); 
while (regexMatcher.find()) { 
    // the match: regexMatcher.group() 
} 

Объяснения

  • \(.*?\)(?![^(]*\)) соответствует открывающей скобке и все вплоть до закрывающей скобки, не следует открывающей пар и больше закрытия Парс. Это работает для (simple(nesting)) в вашем выражении, но не будет работать на (this(kind)of(nesting)) (см PHP решения)
  • | ИЛИ ...
  • [^\s(]+ любых символов, которые не являются пробелами или открытие пара

PHP Вариант с рекурсией

в PHP, мы можем использовать рекурсию, чтобы соответствовать вложенным конструкциям более точно (это будет преодолеть проблему Java с (this(kind)of(nesting)):

(\((?:[^()]++|(?1))*\))|[^\s(]+ 
+0

FYI, добавлен код Java.Кроме того, помимо опции Java, добавлена ​​опция PHP для сопоставления более сложных вложенных круглых скобок. Дайте мне знать, если это сработает для вас. :) – zx81

+0

Работает отлично, большое вам спасибо. :) – FrankTominc

+0

Рад это услышать, спасибо! – zx81

1

Я написал небольшую программу Java для разделения вместо использования регулярных выражений spli см, если это может помочь

import java.util.ArrayList; 


public class Test2 { 
    public static void main(String args[]) { 

     System.out.println(splitExp("a + 4 * log(3/abs(1 – x)) + sen(-b/4 + PI)")); 
    } 

    private static ArrayList<String> splitExp(String exp) { 

     StringBuilder chString = new StringBuilder(); 
     ArrayList<String> arrL = new ArrayList<String>(); 

     for (int i = 0 ; i < exp.length() ; i++) { 

      char ch = exp.charAt(i); 

      if(ch == ' ') 
       continue; 

      if((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) { 
       chString = chString.append(String.valueOf(ch)); 
      } 
      else { 
       if (chString.length() > 0) { 
        arrL.add(chString.toString()); 
        chString = new StringBuilder(); 
       } 
       arrL.add(String.valueOf(ch)); 
      } 
     } 
     return arrL; 
    } 
}