2016-05-03 6 views
9

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

HELLO,THERE,WORLD 

И я написал следующий шаблон

^(?:([A-Z]+),?)+$ 

, что я хочу сделать, это, захватить каждое слово, так что группа 1 является: " HELLO ", группа 2 -" THERE ", а группа 3 - WORLD. То, что мое регулярное выражение действительно захватывает только последнее, которое является" WORLD ".

Я тестирую мое регулярное выражение here, и я хочу использовать его с Swift (может быть, есть способ Свифта, чтобы получить промежуточные результаты как-то, так что я могу использовать их?)

UPDATE: Я не» t хотите использовать split. Мне просто нужно теперь, как захватить все группы, которые соответствуют шаблону, а не только последний.

+0

Почему бы не разделить на ','? – rock321987

+0

Почему бы не использовать '[A-Z] +' или '[^,] +' для захвата результатов – rock321987

+0

rock321987, я обновил строку ввода. Мне нужно извлечь именно строку, которая следует за приведенным выше шаблоном. И мне нужно, чтобы все группы соответствовали шаблону, а не только последнему. Я хочу знать, как это сделать с помощью регулярного выражения. – phbelov

ответ

12

С одной группой в шаблоне вы можете получить только один точный результат в этой группе. Если ваша группа захвата повторяется по шаблону (вы использовали квант + в соседней группе, не участвующей в съемке), сохраняется только последнее значение, которое соответствует ему.

Вы должны использовать функции реализации регулярных выражений выбранного языка в найти все совпадения узора, то вы должны удалить якоря и кванторный не-захватом группы (и вы могли бы опустить, не захватив группу сам).

В качестве альтернативы, расширить регулярное выражение, и пусть шаблон содержит одну группу захвата на группу вы хотите получить в результате:

^([A-Z]+),([A-Z]+),([A-Z]+)$ 
+0

Как это сделать корректироваться с учетом различного количества строк? например ПРИВЕТ, МИР И ПРИВЕТ, ТАМ, МОЙ, МИР. Я ищу только одно выражение для обработки обоих примеров и с гибкостью, встроенной для более длинных строковых массивов – Chris

1

Просто, чтобы обеспечить дополнительный пример пункта 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