1

次の数を取得するために、同じ正規表現内の複数の入力を一致させようとしています。
入力が最初のグループと一致しない場合は、以前のすべてのキャプチャグループがグループと一致しないにもかかわらずキャプチャされているため、問題が発生します。アサーションを使用する必要があると思いますlookaroundが、私はそれらに精通していません。

サンプル入力:

wordA 123456
wordA: 123456
wordA : 123456
wordA R123465
wordA: R123456
wordA : R123456
wordB R123465

WordAにはオプション:と。の両方がありますR。これまでのところ私はこれを持っています:/(?:wordA :?R?(\d+)|wordB R(\d+))/i
最後のサンプル入力を使用すると、次の結果が得られます。

array
  0 => string 'wordB R123456' (length=13)
  1 => string '' (length=0)
  2 => string '123456' (length=6)

求められる結果は次のとおりです。

array
  0 => string 'wordB R123465' (length=13)
  1 => string '123456' (length=6)

修正する方法はありますか?

4

2 に答える 2

3

問題はあなたの交代です

/(?:wordA :?R?(\d+)|wordB R(\d+))/i
              ^^^^^        ^^^^^
             Group 1       Group 2

したがって、正規表現が2番目の選択肢と一致する場合、結果はグループ2(array[2])になり、最初のグループは空になります。

これに変更してください

(?:wordA :?R?|wordB R)(\d+)

ここRegexrでそれを参照してください

そうすれば、あなたの番号は常に最初のグループになります(1つしかないため)

于 2012-04-16T13:50:52.570 に答える
1

2つのキャプチャグループを定義しているため、結果として2つになります。正規表現の実装は、一度に1つだけが一致できるかどうかを気にしません。式を次のように書き直すことができます

/(?:wordA :?R?|wordB R)(\d+)/i

2つのキャプチャグループを定義しないようにします。テストケースをまた:?R?はと一致させるには不十分であることに注意してください。それらを取得するには、_:_:_

/(?:wordA ?:? R?|wordB R)(\d+)/i
于 2012-04-16T13:54:08.347 に答える