regex - 間に特定の単語が含まれない特定の単語の 2 つの出現を検索する正規表現 (PCRE) はどれですか?

okwaves2024-01-25  8

閉まっている。この質問はさらに焦点を絞る必要があります。現在回答を受け付けておりません。

この質問を改善したいですか?この投稿を編集して、1 つの問題のみに焦点を当てた質問を更新してください。

3 年前

に閉鎖されました。

この質問を改善してください

複数行のファイル内で、間に特定の単語を含まない 2 つの単語の出現を検索する PCRE 正規表現を考えるのに助けが必要です。

以下の最初の例は、「foo」なので一致するはずです。 「bar」という単語なしで 2 回出現します。一方、2 番目の例は一致しないはずです。 「bar」という単語が 2 回出現します。

一致例:

フー 飛び降りた 以上 の 怠け者 ふー

一致しない例:

フー 飛び降りた 以上 の バー ふー

1

正規表現と重複する可能性があります: b が a と c の間に入らないようにする

– リザード チェコ語

2020 年 9 月 3 日 20:33



------------------------

あなたの質問は以前にも尋ねられたかもしれませんが、まったく同じではないかもしれません。ここでの 1 つのアプローチは、foo の出現間を照合するときに強化されたドットを使用して、途中でバーを越えないようにすることです。ドットオールモードを有効にして次の正規表現を実行してみてください。

\bfoo\b((?!\bbar\b).)*?\bfoo\b

デモ

これは使用される正規表現パターンの説明:

\bfoo\b           match an initial "foo"
((?!\bbar\b).)*?  match any content, including across newlines, provided
                  that we do not pass "bar" along the way
\bfoo\b           match a final "foo"

利用可能なドットオールモードがない場合は、同様のパターンを使用してシミュレートできます。

\bfoo\b((?!\bbar\b)[\s\S])*?\bfoo\b

2

ご回答ありがとうございます。同じような動作する式を見つけたと思います: "foo(?:(?!bar).)*?foo"しかし、単語境界アサーションは良い追加です。

– dave_erie

2020 年 9 月 3 日 15:50

@dave_erie 上に貼り付けたものと私の答えの主な違いは、あなたのバージョンでは単語の境界を使用していないことです。パターンに誤検知がある可能性のあるサンプル データが存在する可能性があります。

– ティム・ビーゲライゼン

2020 年 9 月 3 日 15:52

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。