Рассмотрим следующее регулярное выражение:
(([^\|])*\|)*([^\|]*)
Это соответствует повторяющимся шаблонам строк типа
("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 повторяющихся подстрок?
- Как я могу получить последнюю подстроку?
- Как проверить, что строка совпала?