2009-05-29 21 views
16

正規表現が同じ正規表現の他の部分に基づいてマッチすることは可能ですか?正規表現内の繰り返し部分文字列のマッチング

たとえば、文字の種類にかかわらず、3文字の同じシーケンスで始まる行と終わる行をどのように一致させることができますか?

マッチ:

abcabc 
xyz abc xyz 

が一致していません:

abc123 

未定義:(最も簡単な方、一致するかすることはできません)

理想的
ababa 
a 

、私がしたいですperlの正規表現のフレーバーの何か。それが不可能な場合は、のようなフレーバーがあるかどうかを知ることに興味があります。

答えて

19

キャプチャグループと後方参照を使用します。

/^(.{3}).*\1$/ 

\1は、第一の捕捉基(()のコンテンツ)の内容にマッチされているものに戻っ指します。ほとんどの言語の正規表現では、このようなことが可能です。最初と最後に同じ文字については

+3

えっ、私が実際に見つける/置き換えるの一部を置き換えるにおける年間のキャプチャグループと後方参照を使用してきました。私は元のマッチパターンでも使えるとは思っていませんでした。 – Whatsit

13

backreferencesが必要です。最初のビットにキャプチャグループを使用し、最後のビットと一致させようとしているときに参照することです。ここでは(以前与えられたリンクから)HTMLの開始タグと終了タグのペアを一致させる例を示します

<([A-Z][A-Z0-9]*)\b[^>]*>.*?</\1> 

この正規表現は、文字列が最初に後方参照に[A-Z][A-Z0-9]*にマッチした取り込み、括弧の唯一のペアが含まれています。この逆参照は、\1(バックスラッシュ1)で再利用されます。 /の前には、単に一致させようとしている終了HTMLタグのスラッシュだけです。

/^(.{3}).*\1$/ 

(はい、それはブライアンCarperが掲載正規表現ちょうどこれを行うには、多くの方法がありません。。)

詳細な説明は:お使いの場合にこれを適用する

後世のために(それはあなたの下にいた場合に侮辱されないようにしてください):

  • ^は、行の先頭に一致します。
  • (.{3})任意のタイプの3文字を取得し、後で参照できるようにグループに保存します。
  • .*は可能な限り長く一致します。 (あなたが行の途中に何があるか気にしません。)
  • \1は、ステップ2
  • $で捕獲されたグループは、行の末尾にマッチ一致しました。
1

これは動作します:あなたが^$アンカーを追加する必要があります開始と終了をマッチングするための

my $test = 'abcabc'; 
print $test =~ m/^([a-z]{3}).*(\1)$/; 

を。

関連する問題