1. ホーム
  2. regex

[解決済み] 単語を含まない行にマッチさせる方法 [重複]について

2023-04-22 21:10:21

質問

PythonスタイルのREGEXを使用して、特定の単語を含まない行にマッチさせる方法を考えていました(Pythonの関数を使用せず、単にREGEXを使用)?

PART ONE OVERVIEW 1 
Chapter 1 Introduction 3

QUATTRO;PART;を含まない行にマッチさせたい。

どのように解決するのですか?

これは動作するはずです。

/^((?!PART).)*$/

行頭からだけ除外したい場合(しないとは思いますが、ご参考までに)、こんな使い方もできます。

/^(?!PART)/

編集する(リクエストによる)。このパターンが有効な理由

このパターンは (?!...) の構文は 負のルックアヘッド で、これはいつも説明するのが難しいと思っています。基本的に、それは このポイントに続くものは正規表現にマッチしてはいけません。 /PART/ ." リンク先のサイトでは、私よりもずっとうまく説明されていますが、これを分解してみます。

^         #Start matching from the beginning of the string.    
(?!PART)  #This position must not be followed by the string "PART".
.         #Matches any character except line breaks (it will include those in single-line mode).
$         #Match all the way until the end of the string.

((?!xxx).)* イディオムは、おそらく最も理解しにくいものでしょう。私たちが見たように (?!PART) は先の文字列を見て、次に来るものはサブパターンにマッチしないと言います。 /PART/ . ですから、私たちが ((?!xxx).)* でやっていることは、文字列を一文字ずつ調べて、すべての文字にこのルールを適用しているのです。各文字は何でも構いませんが、その文字と、その次の数文字を取ると、単語 パート .

^$ のアンカーは、文字列の最初から最後までの全体にルールを適用することを要求するために存在します。これらのアンカーがない場合、文字列のどの部分であっても、先頭が PART で始まらない文字列はすべてマッチしてしまいます。たとえ PART にもマッチします。なぜなら、(例えば) 文字 A の後には正確な文字列である PART .

私たちは ^$ であれば パート が文字列のどこかにあれば、そのうちの1文字が (?=PART). にマッチし、全体のマッチは失敗します。お役に立てれば幸いです。