1

次の文字列を前提として、リストの要素とコロンの後の残りの部分を一致させたいと思います。

foo、bar、baz:何か

つまり、最初の3つのマッチグループは「foo」、「bar」、「baz」であると予想しています。カンマもコロンもありません。要素の最小数は1であり、任意の数にすることができます。空白や小文字は使用しないと想定します。

私はこれを試しましたが、これは機能するはずですが、何らかの理由ですべての一致グループにデータが入力されません。

^([a-z]+)(?:,([a-z]+))*:(something)

これは、\1のfooと\2のbaz(または最後の要素が何であれ)に一致します。バーのマッチグループがない理由がわかりません。

何か案は?

編集:それが重要な場合は、Ruby1.9.3。

EDIT2:Rubularリンク:http ://rubular.com/r/pDhByoarbA

EDIT3:リストに一致させようとしているだけではないので、最後にコロンを追加します。申し訳ありませんが、問題を単純化しすぎています。

4

4 に答える 4

4

この式は私のために働きます:/(\w+)/i

于 2012-04-28T21:21:46.610 に答える
1

正規表現でやりたいのなら、これはどうですか?

(?<=^|,)("[^"]*"|[^,]*)(?=,|$)

これは、カンマで区切られたフィールドに一致します。これには、。のような引用符で囲まれた文字列内にコンマが表示される可能性が含まれます123,"Yes, No"このための正規表現。

もっと詳しく:

(?<=^|,)       # Must be preceded by start-of-line or comma
(
    "[^"]*"|   # A quote, followed by a bunch of non-quotes, followed by quote, OR
    [^,]*      # OR anything until the next comma
)
(?=,|$)        # Must end with comma or end-of-line

使用法は、Pythonのようなものre.findall()で、文字列内の重複しないすべての一致を返します(重要な場合は、左から右に機能します)。re.search()またはre.match()、最初に見つかった一致のみを返すものと同等のものと一緒に使用しないでください。

(注:後読み(?<=^|,)が固定幅ではないため、これは実際にはPythonでは機能しません。Grr。これに関する提案を受け付けています。)


編集:後読みの代わりに、非キャプチャグループを使用して行頭またはコンマを使用します。これはPythonで機能します。

>>> test_str = '123,456,"String","String, with, commas","Zero-width fields next",,"",nyet,123'
>>> m = re.findall('(?:^|,)("[^"]*"|[^,]*)(?=,|$)',test_str)
>>> m
['123', '456', '"String"', '"String, with, commas"',
 '"Zero-width fields next"', '', '""', 'nyet', '123']

編集2:Pythonに相当するRubyre.findall(needle, haystack)haystack.scan(needle)です。

于 2012-04-28T21:34:26.103 に答える
0

たぶんsplit、この場合のより良い解決策になるでしょうか?

'foo,bar,baz'.split(',')
=> ["foo", "bar", "baz"]
于 2012-04-28T21:20:44.833 に答える
0

私があなたの投稿を正しく解釈しているのなら、コロン(:)の前にすべてをコンマで区切ってください。

これに適した正規表現は次のとおりです。

[^\s:]*(,[^\s:]*)*(:.*)?

これはあなたが探しているすべてを見つけるはずです。

于 2018-06-28T15:40:39.413 に答える