1. ホーム
  2. regex

[解決済み] Regex Until But Not Including

2023-03-24 10:36:19

質問

regexについて、until but not includeを検索する構文は何ですか?ようなものです。

Haystack:
The quick red fox jumped over the lazy brown dog

Expression:
.*?quick -> and then everything until it hits the letter "z" but do not include z

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

明示的なquot;searchの言い方 X を含むが X "です。

(?:(?!X).)*

ここで X は任意の正規表現である。

しかし、あなたの場合、これはやりすぎかもしれません - ここでは最も簡単な方法は

[^z]*

以外のものにマッチします。 z にマッチするので、次の z .

そこで .*?quick[^z]*The quick fox jumps over the la .

しかし、単純な文字が複数になると、すぐに (?:(?!X).)* が使われるようになります。

(?:(?!lazy).)* - という単語の先頭までが一致します。 lazy .

これは ルックアヘッド・アサーション で、より具体的には負のルックヘッドです。

.*?quick(?:(?!lazy).)*The quick fox jumps over the .

説明

(?:        # Match the following but do not capture it:
 (?!lazy)  # (first assert that it's not possible to match "lazy" here
 .         # then match any character
)*         # end of group, zero or more repetitions.

さらに、キーワードを検索する場合、単語境界のアンカーで囲むとよいでしょう。 \bfox\b は完全な単語 fox の中のキツネにはマッチしません。 foxy .

ノート

マッチさせるテキストに改行が含まれる場合、正規表現エンジンの "dot matches all" オプションを設定する必要があります。通常、このオプションは (?s) を先頭につけることで実現できますが、これはすべての正規表現エンジン(特にJavaScript)で動作するわけではありません。

代替の解決策です。

多くの場合、遅延量詞を使ったよりシンプルで読みやすい解決策を使うこともできます。を追加することで ?* を指定すると、現在の位置からできるだけ少ない文字にマッチしようとします。

.*?(?=(?:X)|$)

は任意の数の文字にマッチし、直前の X (これは任意の正規表現) または文字列の終端 (もし X がマッチしない場合)。また、これを動作させるために "dot matches all" オプションを設定する必要がある場合もあります。(注意: 私は、捕捉しないグループを X の周りに捕捉しないグループを追加して、交互配列から確実に分離するようにしました)