Как захватить несколько повторяющихся групп?

Мне нужно захватить несколько групп одного и того же шаблона. Предположим, у меня есть следующая строка:

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']