2

正規表現に関してはメンタルブロックを持っているようですので、助けていただければ幸いです。

この形式の文字列があります

.* :: .* :: .*

しかし、時には次のようになります。

.* :: .*

このように、最初の 2 つの文字グループをキャプチャしたい

(.*) :: (.*) :: .*

しかし、最後の :: と文字がオプションになるように式を変更する方法がわかりません。括弧と を使用してみまし?たが、思い通りに動作させることができません。

ありがとう

4

3 に答える 3

2

これはあなたが望むものです:

([^:]*) :: ([^:]*) (:: ([^:]*))?

アクセスするキャプチャ グループは、1、2、および 4 です (4 は空である可能性があります)。

編集:

.*?非貪欲 .*です。つまり、可能な限り少ないワイルドカード文字に一致します。これにより、最初のグループが最初の 2 つのパターンに一致しなくなります。

別のオプションは、パターンに含まれていないことがわかっている場合.*に置き換えることです。[^:]*:

于 2012-12-10T03:14:05.770 に答える
1

とった!

(.*?) :: (.*?(?= :: |$))

これがどのように機能するかの内訳は次のとおりです。

-> これにより、最初の :: の前の文字の最初のバッチが分離され、グループ $1 に保存されます。

(.*?)

-> 次に、このチャンクは 2 つのことを行います。まず、.*? を使用します。文字の 2 番目のバッチを取得します。この後、ゼロ幅の正の先読みアサーション (?= :: |$) では、文字が別の :: または $ (テキストの終わり) で終わる必要がありますが、それらを一致グループに含めないことを意味します。文字の 2 番目のバッチだけが $2 に保存されます。

(.*?(?= :: |$))

これらの文字列に対してObjective-Cでテストして成功しました:

  • 「ABC :: デフ」
  • 「ABC :: DEF :: GHI」
  • "A:B:C :: D:E:F" (これにより、単一の : が :: の間のテキストに含まれるようになります)
  • "A:B:C :: D:E:F :: G:H:I" (これにより、単一の : が :: の間のテキストに含まれるようになります)
于 2012-12-10T22:13:26.160 に答える
1

このようなものはどうですか?

(.* ::){2}(?:::)?

の後に続く 2 つのものに一致::し、最後のものにはオプションの を含めることができます::

于 2012-12-10T03:19:04.537 に答える