2016-02-24 10 views
5

番号がキャプチャグループの番号以上の文字列と一致させたい。番号範囲でバックリファレンスを使用することはできますか?

例:

  • 1x1 =試合
  • 1x2 =試合
  • 2x1 =一致なし

私の心の中での正規表現は、この(\d)x[\1-9]ようになりますが、これにはありません作業。それは正規表現を使用してこれを達成することは可能ですか?あなたが発見してきたように

+3

正規表現のフレーバーとは何ですか? –

+0

私はgoogle analyticsでそれを使用しようとしていますが、その味はわかりませんが、私はPCPREと仮定します – Frinsh

+2

いいえ、GAはRE2を使用します。つまり、純粋な正規表現では実行できません。 –

答えて

2

、あなたはので、正規表現内の値を補間することはできません。正規表現のコンパイル時に文字クラスが決定されているので

...唯一の文字クラス正規表現のノードタイプは、「ハードです正規表現がコンパイルされたときに作成されたコード化された文字のリスト "(部分的に実行された後、$ 1が終わるかもしれないことを理解した後ではない)。

[Source]

文字クラスは後方参照を許可していないので、多数のバックスラッシュは文字クラスに再利用されます。

2または3桁の8進数に続くバックスラッシュがあります8進数とみなされます。

[Source]

これは明らかにあなたが[\1-9]が意図したものではありません。しかし、すべての文字が分かるまで文字クラスをコンパイルする方法はないので、別の方法を見つける必要があります。

これを正規表現内で完全に実行しようとしている場合は、すべての組み合わせをチェックして一致するものを確認する必要があるため、すべての組み合わせを列挙できません。 For example

"1x2" =~ m/(?:(0)x(\d)|(1)x([1-9])|(2)x([2-9])|(3)x([3-9])|(4)x([4-9])|(5)x([5-9])|(6)x([6-9])|(7)x([7-9])|(8)x([89])|(9)x(9))/ 

$4$3と「2」に「1」が含まれていますが、あなたは何をするたびにマッチした場合には見つけることが20にキャプチャ1を検索する必要があると思います。


周りの正規表現の結果に後処理を行う唯一の方法は、正規表現の条件を使用することです:(?(A)X)Aは、条件付きで、Xは結果のアクションであるところ。

Sadly conditionals are not supported by RE2ですが、これを行うことができます。 http://www.rexegg.com/regex-tricks.html#fail

何がAのために使用したいと思いますが?{$1 > $2}が、only Perl will allow you to use code directly in a regexです:あなたはXのために使用したいと思い何

は、失敗を強制する(*F)(または(?!) Rubyで2+)です。Perlはあなたが使用できるようになります

m/(\d)x(\d)(?(?{$1 > $2})(?!))/ 

[Live Example]

だからあなたの質問への答えは: "はありません、あなたは、Google Analyticsはを使用していますRE2でこれを行うことはできませんが、はい、あなたは行うことができますこれはPerlの正規表現を使用しています。

関連する問題