どのようにして一連の交代をPerl正規表現に内挿することができますか?

perl regex

それは可能ですか?

@foo = getPileOfStrings();

if($ text =〜/@foo(*.?)@foo/){print "甘い、あなたは$ 1をつかみました! それはfoosの間に住んでいました! ";}

ここで何が起こっているのか私は `$ text =〜/($ var1 | $ var2 | $ var3)(*。?)($ var1 …​ /`が必要です)実行時まで値がわかりません。

一連のORへの配列の内挿はこれを行う直接的な方法のように思えましたが、うまくいかないようで、私はねじれのある一連のコードになっています。

  2  1


ベストアンサー

http://perldoc.perl.org/functions/join.html[`join`]と http://perldoc.perl.org/functions/join.html[` qr // `を使用してください]演算子:
my $ strings = join "|"、getPileOfStrings(); my $ re = qr / $ strings /; #パターンをコンパイルする

if($ text =〜/$re(*.?)$re/)

同じ単語を途中で区切るには、次のようにします。

if($ text =〜/($ re)(。*?)\ 1 /)

文字列にPerlの正規表現で特殊と見なされる文字が含まれる可能性がある場合は、 mapおよびhttp://perldoc.perl.org/を使用することをお勧めします。それらが正規表現によって使用されるのを防ぐためのfunctions / quotemeta.html [quotemeta]:

my $ strings = join "|"、quotemetaをマップし、getPileOfStrings();

Michael Carmanが指摘するように、 getPileOfStrings()`が文字列を一致させたい順序で返すように設計されていない場合は、http://perldoc.perl.org/functions/sortを使用することをお勧めします。 .html [`sort]は最長一致を交互に最初にするように強制します(交互のより前の項目はPerl 5では最初に一致します)。

my $ strings = join "|" map quotemeta、sort {長さ$ a <=>長さ$ b} getPileOfStrings();

" a …​ "(長さ4)は " a \\。\\。\\。 "(長さ6)に変換され、それは `” aaaaaa “`より長いので、quotemetaを実行する前にソートすることを忘れないでください(長さ5)

11


あなたは Regex::PreSufを使うことができます。

my $ re = presuf(getPileOfStrings());

これを進める前に、次のコードに何をさせたいのかを考えてみてください。

#!/ usr / bin / perl

厳密を使用してください。警告を使用します。

my @ pile = qw(ar a); my $ string = 'ar5a';

my $ pile = join '|'、@pile; my $ re = qr / $ pile /;

my($ captured)= $ string =〜/$re(.*?)$re/;

"$ captured \ n"を表示します。

$ captured`に “r5” を含ませたい場合は、以下のように結合する前に @ pile`をその要素の長さで並べ替えます。

my $ pile = join '|'、sort {長さ$ a <=>長さ$ b} @pile;

4


タイトルとURLをコピーしました