Перекрытие регулярное выражение


Я нашел аналогичный вопросздесь . Однако у меня это не получилось:

У меня есть строка типа "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".

2 4

2 ответа:

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

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

Этого можно достичь с помощью регулярного выражения: (?=((?:_|^)[^_]*+(?:_|$)))
Объясненная демонстрация здесь: http://regex101.com/r/tB0bZ4