わかりました、D で始まり E で終わる単語を出力する単純な Perl 5 スクリプトに行きます...
$_ = "Dog Die Do Dome";
/^d.*e$/i;
示されているように、正規表現を使用してテキストを検索し、そのような単語を見つけましたが、それらを印刷するにはどうすればよいですか? 助けてくれてありがとう。
/g
修飾子を使用して、配列にキャプチャできます。
use feature 'say';
my @words = /\bd\S+e\b/ig;
say for @words;
リスト コンテキストでは、これは "d" で始まり "e" で終わるすべての一致を返します。その一致は貪欲で.*
あるため、使用できないことに注意してください。単語境界を使用すると、 with などの部分一致を防ぐことができます。"dog do die"
dog do die
"die"
\b
foobaresk
まず、正規表現が文字列全体をキャプチャしていることです。正規表現は通常貪欲であるため、.*
は文字列の最も長い部分に一致します。正規表現はaで始まり、d
で終わるためe
、文字列全体に一致します。
これを回避する方法はいくつかあります。
my $string = "Dog Die Do Dome";
my $string =~ /d[\S]+e/ig;
は空白なし\S
と言っているので、aで始まり、anで終わり、空白を含まない単語のみを一致させます。したがって、これで個別に一致しますが、とは一致しません。これは正規表現の一般的なトリックです。たとえば、文字列があり、最初の単語のみを照合したいとします。を使用すると、トリックが実行されます(これは、前述の0個以上を表すことができることを忘れないでください。したがって、少なくとも1つに一致するように2倍にします)。これは主に、Perlの拡張されたregualar式の能力がない古いバージョンのgrepまたはsedで使用されます。上記の例では、代わりにを使用しましたD
E
Die
Dome
Dog
Do
foo-bar-bam
/[^-][^-]*/
*
+
*
は、前述の1つ以上に+
一致することを意味します。
*
Perlには、または+
:の後に疑問符を追加することにより、正規表現を貪欲でないものにする方法もあります。
my $string =~ /d.+?e/ig;
ただし、あなたの場合、これは一致Dog Die
し、Dome
おそらくあなたが望むものではありません。
プログラムは次のとおりです。
use strict;
use warnings;
use feature qw(say);
my $string = "Dog Die Do Dome";
my @matches = ($string =~ /D\S+e/gi);
for my $word (@matches) {
say "The first match is $word";
}
そして、それは印刷されます:
The first match is Die
The first match is Dome
さて、多分私は使うべきではありませんThe first match
が、あなたはその考えを理解します。このサンプルプログラムをさまざまな正規表現で試して、何が起こるかを確認してください。
>cat temp
Dog Die Do Dome
>perl -lne '@a=split" ";foreach(@a){print if(/^[dD].*[eE]$/)}' temp
Die
Dome
print
ステートメントを使用するprintステートメントを使用して、出力を画面に送信します。行全体を照合しているので、ここで複雑なことをする必要はありません。暗黙の$_変数を使用できます。例えば:
print if /^d.*e$/i
1
2 my $word_list = "Dog Die Do Dome";
3 my @words = split ' ', $word_list;
4 for my $word (@words) {
5 print "$word\n" if $word =~ /^d.*e$/i;
6 }
~
~
~
~