0

私は最近、正規表現をよく調べていて、2 番目の単語が存在しない 1 つの単語の一致に関する多くの回答を見てきました。特定の単語(またはその場所のより複雑な正規表現)を正規表現で検索し、単語が欠落している場所を見つけることができる多くの正規表現のを見てきました。

行ごとに非常にうまく機能しているように見えますが、複数行モードを含めた後でも、適切に一致していないようです。

foo: 単語が含まれているファイル文字列全体に一致しますが、その単語barはファイルにはありません。私がこれまでに持っているのは、サンプルリンク(?m)^(?=.*?(foo))((?!bar).)*$に基づいているものです。Ruby 正規表現テスターでテストしてきましたが、それはオープンエンドの正規表現の問題/質問だと思います。小さい部分に一致するようですが、文字列全体を 1 つの大きなチャンクとして一致させる/一致させないようにしたいと考えています。

上記の例では、行単位で一致が検出されているようです。文字列全体に適用されるようにするには、正規表現にどのような変更を加える必要がありますか?

編集:正規表現を使用せずに、この問題を解決するためのより効率的な方法が他にもあることを知っています。私は他の手段を使用して問題の解決策を探しているのではなく、理論的な正規表現の観点から尋ねています。複数行モード (「機能する」ように見える) があり、行ごとに組み合わせることができる否定/肯定検索があります。

4

2 に答える 2

2

Sawa の答えは単純化できます。必要なのは、肯定的な先読みと否定的な先読みだけです。複数行モードになっ.*ているため、残りは処理されます。

/(?=.*foo)(?!.*bar).*/m

.複数行は一致することを意味し\n、一致は貪欲です。したがって、文字列全体がアンカーなしで一致します。

アップデート

@Sawa は、\Aが必要であるが\Z. 実際、もう一度見てみると、肯定的な先読みは不要に思えます。

/\A(?!.*bar).*foo.*/m
于 2013-03-05T22:00:58.100 に答える
2

を含まない文字列全体に一致する正規表現は次のとおりfooです。

/\A(?!.*foo.*).*\z/m

を含む文字列全体の先頭から一致する正規表現barは次のとおりです。

/\A.*bar/m

これらの両方を満たしたいので、これらのいずれかを先読みに入れて結合します。

/\A(?=.*bar)(?!.*foo.*).*\z/m
于 2013-03-05T19:54:27.783 に答える