1

Perl で複数行の正規表現を行う方法については、多くの質問があります。それらのほとんどはs、ドットを改行に一致させるスイッチについて言及しています。ただし、正確なフレーズ(パターンではない)に一致させたいのですが、改行がどこにあるのかわかりません。問題は、改行を と一致させるのではなく、無視.できるかということです。

MWE:

$pattern = "Match this exact phrase across newlines";

$text1 = "Match\nthis exact\nphrase across newlines";
$text2 = "Match this\nexact phra\nse across\nnewlines";

$text3 = "Keep any newlines\nMatch this exact\nphrase across newlines\noutside\nof the match";

$text1 =~ s/$pattern/replacement text/s;
$text2 =~ s/$pattern/replacement text/s;
$text3 =~ s/$pattern/replacement text/s;

print "$text1\n---\n$text2\n---\n$text3\n";

スペース ( ) の代わりにドットをパターンに入れることができます"Match.this.exact.phrase"が、2 番目の例ではうまくいきません。前処理としてすべての改行を削除できますが、一致の一部ではない改行を保持したいと思います (3 番目の例のように)。

望ましい出力:

replacement text
---
replacement text
---
Keep any newlines
replacement text
outside
of the match
4

4 に答える 4

3

ほとんどの場合、改行をスペースとして扱っています。それがあなたのやりたいことのすべてなら、あなたが必要とするのは

$text =~ s/\n/ /g;
$text =~ /\Q$text_to_find/    # or $text =~ /$regex_pattern_to_match/

次に、それを無視したい場合があります。それがあなたのやりたいことのすべてなら、あなたが必要とするのは

$text =~ s/\n//g;
$text =~ /\Q$text_to_find/    # or $text =~ /$regex_pattern_to_match/

一致する正規表現パターンがある場合、両方を行うことはほぼ不可能です。しかし、リテラル テキストに一致させたいと思われるため、いくつかの可能性が開かれます。

( my $pattern = $text_to_find )
   =~ s/(.)/ $1 eq " " ? "[ \\n]" : "\\n?" . quotemeta($1) /seg;
$pattern =~ s/^\\n\?//;
$text =~ /$pattern/
于 2016-05-24T14:38:03.243 に答える
1

それは確かに醜いですが、うまくいきます:

M\n?a\n?t\n?c\n?h\st\n?h\n?i\n?s\se\n?x\n?a\n?ct\sp\n?h\n?r\n?a\n?s\n?e\sa\n?c\n?r\n?o\n?s\n?s\sn\n?e\n?w\n?l\n?i\n?n\n?e\n?s

単語内の文字のペアごとに、それらの間に改行を許可します\n?。そして、正規表現の各スペースを に置き換えます\s

使えないかもしれませんが、仕事は完了します;)

regex101 で確認してください

于 2016-05-24T14:20:47.267 に答える