В Java я пытаюсь вернуть все совпадения регулярных выражений в массив, но кажется, что вы можете только проверить, соответствует ли шаблон чему-либо или нет (булево).
Как я могу использовать соответствие регулярному выражению для формирования массива всех строк, соответствующих выражению регулярного выражения в данной строке?
Ответы:
( Ответ 4castle лучше, чем приведенный ниже, если вы предполагаете, что Java> = 9)
Вам нужно создать сопоставление и использовать его для итеративного поиска совпадений.
После этого
allMatches
содержит совпадения, и вы можете использовать ихallMatches.toArray(new String[0])
для получения массива, если он вам действительно нужен.Вы также можете использовать
MatchResult
для написания вспомогательных функций для зацикливания совпадений, посколькуMatcher.toMatchResult()
возвращает снимок текущего состояния группы.Например, вы можете написать ленивый итератор, чтобы позволить вам сделать
делая что-то вроде этого:
С этим,
доходность
источник
ArrayList
иLinkedList
результаты могут быть удивительными.allMatches
vsyourStringHere.length()
), вы, вероятно, можете заранее рассчитать хороший размер дляallMatches
. По моему опыту, затратыLinkedList
памяти и эффективности итераций обычно не стоят того, поэтому яLinkedList
не по умолчанию. Но при оптимизации хот-спота, безусловно, стоит поменять реализации списка, чтобы увидеть, есть ли у вас улучшения.Matcher#results
чтобы получитьStream
который вы можете использовать для создания массива (см моего ответа ).В Java 9 теперь вы можете использовать
Matcher#results()
для получения,Stream<MatchResult>
который вы можете использовать, чтобы получить список / массив совпадений.источник
Java делает регулярные выражения слишком сложными и не соответствует стилю perl. Взгляните на MentaRegex, чтобы увидеть, как вы можете сделать это в одной строке кода Java:
источник
Вот простой пример:
(если у вас есть больше групп захвата, вы можете ссылаться на них по их индексу в качестве аргумента метода группы. Если вам нужен массив, используйте
list.toArray()
)источник
Pattern.matches()
- статический метод, вы не должны вызывать его вPattern
экземпляре.Pattern.matches(regex, input)
это просто сокращение дляPattern.compile(regex).matcher(input).matches()
.С официальных Regex Java Trails :
Использование
find
и вставить полученныйgroup
в массиве / List / что угодно.источник
источник