2013-03-21 4 views
4

Я нашел аналогичный вопрос here. Однако я не получил его работу:Перекрытие регулярного выражения

У меня есть строка типа «my_token_string» и вам нужно регулярное выражение, чтобы вернуть маркеры «my_», «_token_» и «_string».

Обратите внимание: я не могу изменить java-код, потому что это часть другого программного обеспечения. Единственное, что я могу сделать, это указать шаблон и группу захвата :-)

Это то, что я испытал:

String p = "(?=(_[^_]*_?))"; 
int group = 1; 
String test = "my_token_string"; 

Matcher m = Pattern.compile(p).matcher(test); 
while (m.find()) { 
    System.out.println(m.group(group)); 
} 

Но, конечно, это возвращает только жетоны «_token_» и «_string ».

ответ

4

Вы можете попробовать "(?=((^|_).+?(_|$)))". В качестве номера группы используйте 1.

Это позволит токенов начать с _ или начала ввода (^) и конец его с _ или конец ввода ($). Вместо .+? вы можете использовать [^_]+, но я предпочитаю эту версию.

3

Вы можете добиться этого с RegEx: (?=((?:_|^)[^_]*+(?:_|$)))
Разъяснения демо здесь: http://regex101.com/r/tB0bZ4

+0

+1 все равно нет никакой необходимости, не захватывая группы, так как они находятся внутри группы, что OP будет использовать, а не до него. – Pshemo