Как захватить несколько повторяющихся групп?
Мне нужно захватить несколько групп одного и того же шаблона. Предположим, у меня есть следующая строка:
HELLO,THERE,WORLD
И я написал следующий шаблон
^(?:([A-Z]+),?)+$
Я хочу, чтобы это было сделано, это захват каждого слова, так что группа 1: "HELLO", группа 2 - "THERE", а группа 3 - "WORLD". То, что мое регулярное выражение действительно захватывает только последнее, который является "МИРОВОЙ".
Я тестирую свое регулярное выражение здесь, и я хочу использовать его со Swift (возможно, в Swift есть способ получить промежуточные результаты как-то, чтобы я мог их использовать?)
UPDATE: я не хочу использовать split
. Мне просто нужно теперь, как захватить все группы, которые соответствуют шаблону, а не только последний.
Ответы
Ответ 1
С одной группой в шаблоне вы можете получить только один точный результат в этой группе. Если ваша группа захвата повторяется по шаблону (вы использовали квант +
в окружении, не участвующем в съемке), сохраняется только последнее значение, которое соответствует ему.
Вы должны использовать функции реализации регулярного выражения языка, чтобы найти все совпадения шаблона, тогда вам нужно будет удалить привязки и квантификатор группы, не участвующей в захвате (и вы также можете опустить не-захватывающую группу).
В качестве альтернативы разверните ваше регулярное выражение и пусть шаблон содержит одну группу захвата для каждой группы, которую вы хотите получить в результате:
^([A-Z]+),([A-Z]+),([A-Z]+)$
Ответ 2
Просто, чтобы предоставить дополнительный пример параграфа 2 в ответе. Я не уверен, насколько важно, чтобы вы получили три группы в одном матче, а не три матча, используя одну группу. Например, в groovy:
def subject = "HELLO,THERE,WORLD"
def pat = "([A-Z]+)"
def m = (subject =~ pat)
m.eachWithIndex{ g,i ->
println "Match #$i: ${g[1]}"
}
Match #0: HELLO
Match #1: THERE
Match #2: WORLD
Ответ 3
Я думаю, что вам нужно что-то вроде этого....
b="HELLO,THERE,WORLD"
re.findall('[\w]+',b)
Который в Python3 вернется
['HELLO', 'THERE', 'WORLD']