web-dev-qa-db-ja.com

複数の繰り返しグループをキャプチャする方法は?

同じパターンの複数のグループをキャプチャする必要があります。次の文字列があるとします:

HELLO,THERE,WORLD

そして、私は次のパターンを書きました

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

私がやりたいことは、すべての単語をキャプチャし、グループ1が「HELLO」、グループ2が「THERE」、グループ3が「WORLD」になるようにすることです。世界"。

私は正規表現をテストしています here とSwift(Swiftで中間結果を取得する方法があるかもしれません)それらを使用できますか?)

更新:splitを使用したくありません。最後のパターンだけでなく、パターンに一致したすべてのグループをキャプチャする方法が必要です。

45
phbelov

パターンにグループが1つある場合、そのグループで正確な結果を1つだけ取得できます。キャプチャグループがパターンによって繰り返される場合(周囲の非キャプチャグループで+量指定子を使用した場合)、それに一致する最後の値のみが格納されます。

言語の正規表現実装関数を使用して、パターンの一致するものをすべて検索する必要があります。その後、非キャプチャグループのアンカーと数量詞を削除する必要があります(そして、非キャプチャを省略できます)グループ自体も)。

または、正規表現を展開し、結果に含めるグループごとに1つのキャプチャグループをパターンに含めます。

^([A-Z]+),([A-Z]+),([A-Z]+)$
34
Byte Commander

このようなものが必要だと思います。

b="HELLO,THERE,WORLD"
re.findall('[\w]+',b)

Python3ではどれが返されますか

['HELLO', 'THERE', 'WORLD']
1
Tim Seed

回答のパラグラフ2の追加例を提供するだけです。 1つのグループを使用して3つの一致を取得するのではなく、1つの一致で3つのグループを取得することがどれほど重要かはわかりません。例えば、グルーヴィーで:

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
1
AndyJ