2015-06-29 2 views
1

У меня есть строковое выражение, из которого мне нужно получить некоторые значения. Строка выглядит следующим образомJava regex matcher всегда возвращает false

#min({(((fields['example6'].value + fields['example5'].value) * ((fields['example1'].value*5)+fields['example2'].value+fields['example3'].value-fields['example4'].value)) * 0.15),15,9.087}) 

С этой stribg, мне нужно, чтобы получить список массив строк, содержащий значения, такие как «example1», «example2» и так далее.

У меня есть метод Java, который выглядит следующим образом:

String regex = "/fields\\[['\"]([\\w\\s]+)['\"]\\]/g"; 
ArrayList<String> arL = new ArrayList<String>(); 
Pattern p = Pattern.compile(regex); 
Matcher m = p.matcher(expression); 

while(m.find()){ 
    arL.add(m.group()); 
} 

Но m.find() всегда возвращает false. Есть что-то, чего я не хватает?

+1

Вы не используете синтаксис '/.../ g' в Java regex. Они представляют собой разделитель регулярных выражений на других языках, что не обязательно в Java. Удалите их, и ваше регулярное выражение будет работать правильно. – nhahtdh

ответ

1

Проблема с символами '/'. Если вы хотите извлечь только имя поля, вы должны использовать m.group (1):

String regex = "fields\\[['\"]([\\w\\s]+)['\"]\\]"; 
ArrayList<String> arL = new ArrayList<String>(); 
Pattern p = Pattern.compile(regex); 
Matcher m = p.matcher(expression); 

while(m.find()){ 
    arL.add(m.group(1)); 
} 
1

Основная проблема, с которой вы сталкиваетесь, заключается в том, что вы используете разделители (как в PHP или Perl или JavaScript), которые нельзя использовать в регулярном выражении Java. Кроме того, у вас есть свои совпадения в первой группе захвата, но вы используете group(), который возвращает весь матч (включая fields[').

Вот рабочий код:

String str = "#min({(((fields['example6'].value + fields['example5'].value) * ((fields['example1'].value*5)+fields['example2'].value+fields['example3'].value-fields['example4'].value)) * 0.15),15,9.087})"; 
ArrayList<String> arL = new ArrayList<String>(); 
String rx = "(?<=fields\\[['\"])[\\w\\s]*(?=['\"]\\])"; 
Pattern ptrn = Pattern.compile(rx); 
Matcher m = ptrn.matcher(str); 
while (m.find()) { 
    arL.add(m.group()); 
} 

Вот working IDEONE demo

Обратите внимание, что я добавил просмотровых обходные извлечь только тексты между ' с с group().