Рассмотрим следующее регулярное выражение:
(([^\|])*\|)*([^\|]*)
Это соответствует шаблонам повторяющихся строк типа
("whatever except |" |) {0 to any times} ("whatever except |" |) {1 time}
Таким образом, он должен соответствовать следующей строке, которая имеет 17 подстрок (16 повторов плюс «z» как последняя).
"abcd | e | fg | hijk | lmnop | | | qrs | t| uv| w |||||x y| z"
Действительно, RegexPal проверяет, соответствует ли данное регулярное выражение указанной выше строке.
Теперь я хочу получить каждую из подстрок (т. Е. «Abcd |», «e |», «fg |» и т. Д.), Для которых нет предварительных сведений об их количестве, длине и т. Д.
Согласно предыдущему посту StackOverflow с аналогичным названием и документации Matcher
class find()
, мне просто нужно сделать что-то вроде
Pattern pattern = Pattern.compile(regex); // regex is the above regex
Matcher matcher = pattern.matcher(input); // input is the above string
while (matcher.find())
{
System.out.println(matcher.group(1));
}
Однако, когда я делаю это, я просто распечатываю 2 строки: последнюю повторную подстроку ("x y |") и нулевое значение; определенно не те 16 подстрок, которые я ожидаю.
Хорошо бы также проверить, что совпадение действительно произошло , перед запуском цикла find()
, но я не уверен, что matches()
, groupCount() > 0
или какое-то другое условие следует использовать, не выполняя двойной работы по сопоставлению, учитывая, что find()
также выполняет сопоставление.
Итак, вопросов :
- Как мне получить все 16 повторяющихся подстрок?
- Как мне получить последнюю подстроку?
- Как проверить соответствие строки?