2009-03-13 2 views
33

友人が私に尋ねたところ、私は困惑しました:同じキャラクターのシーケンスにマッチする正規表現を作る方法はありますか?たとえば、 'aaa'、 'bbb'では一致しますが、 'abc'では一致しません。同じ文字のシーケンスと一致する正規表現はどれですか?

m|\w{2,3}| 

「abc」に一致するようなトリックはありません。

m|a{2,3}| 

それは自分の質問に答えるなど 'BBB'、 'C​​CC'、

答えて

64

確かにもの!グループ化と参照はあなたの友人です:

(.)\1+ 

同じ文字の2つ以上の一致が一致します。 \wの代わり.を使用し、唯一の単語構成文字の場合、すなわち:

(\w)\1+ 
+0

これは一部の文字にのみ一致し、 '###'のようなものは見逃します。彼はアルファベットの文字をどこに与えたかの例を示したが、アルファベットの文字しか求めていない。私は '\ w'を '。'に置き換えます。 – gpojd

+0

質問者が与えた非運用例に基づいて、私は英字だけを一致させたいと思っていました。私は説明の中でこれを表現していたはずです。 –

+0

スラッシュ1は何を意味していますか? – CodyBugstein

0

が一致しないと同じようにトリックを行うが、それを持っていないでしょう。

m|(\w)\1+| 
+0

\ Wはあなたが望むものの反対ですね。 – Telemachus

+0

Telemachusが正しいです、これはあなたが質問で与えた例と一致しません。 – gpojd

+0

また、正規表現にパイプ(または他のデフォルト以外のデリミタ)を使用しない方がいいです。 – Pat

1

これは後方参照はためているものです。

m/(\w)\1\1/ 

トリックを行います。

+1

これは 'aa'と一致しません。 – gpojd

3

これは@@@のように、 wは\以上になり一致します。

/(.)\1+/ 
+0

これは "aaa"、 "bbb"の例だけでなく、 "同じ文字のシーケンス"の正しいものです。 +1 – Axeman

+0

式をスラッシュ「/」で埋め込んで使用していないのとは何ですか? – skan

10

注意を5.10に、我々は同様に後方参照のための代替表記を持っていること。

foreach (qw(aaa bbb abc)) { 
    say; 
    say ' original' if /(\w)\1+/; 
    say ' new way' if /(\w)\g{1}+/; 
    say ' relative' if /(\w)\g{-1}+/; 
    say ' named' if /(?'char'\w)\g{char}+/; 
    say ' named' if /(?<char>\w)\k<char>+/; 
} 
+0

http://perldoc.perl.org/perlre.htmlまたはhttp://perldoc.perl.org/search.html?q=perlre –

1

これは、純粋な正規表現(正規言語で記述すること、すなわち、それら - ない Perlの正規表現)を使用しても可能です。残念ながら、それは、長さがアルファベットの大きさに比例する正規表現、例えば:... zは有限のアルファベットの記号である

(a* + b* + ... + z*) 

を意味します。

したがって、Perl正規表現は、純粋な正規表現のスーパーセットではありますが、純粋な正規表現に使用したい場合でも、その利点があります。

関連する問題