1. ホーム
  2. javascript

引用符で囲まれていないすべてのインスタンスにマッチする正規表現

2023-11-05 12:47:37

質問

から このQ/A から、与えられた正規表現のすべてのインスタンスをマッチングすることを推論しました。 ではなく は引用符で囲まれているため、マッチングが不可能であることがわかりました。つまり、エスケープされた引用符にはマッチしないのです。 "this whole \"match\" should be taken" ). もし、私の知らない方法があれば、私の問題を解決してくれるでしょう。

しかし、そうでない場合、私はJavaScriptで使用できる効率的な代替手段があるかどうかを知りたいのです。私はそれについて少し考えましたが、すべてではないにしても、ほとんどのケースで機能するようなエレガントなソリューションを思いつきません。

具体的には、私は .split() と .replace() メソッドで動作する代替手段が必要なだけですが、より一般化できれば、それがベストです。

例として

の入力文字列。

+bar+baz"not+or\"+or+\"this+"foo+bar+

を引用符の中ではなく、#に置き換えると、次のようになります。

#bar#baz"not+or\"+or+\"this+"foo#bar#

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

実は、引用符で囲まれていない正規表現は、引用符を閉じた文字列と一致させることができます。例えば、上記の例のように、次のようにマッチさせたいとします。 \+ .

ここで重要なのは、ある単語が引用符の外にある場合、その後に偶数個の引用符が続くということです。これは先読みのアサーションとしてモデル化することができます。

\+(?=([^"]*"[^"]*")*[^"]*$)

さて、エスケープされた引用符を数えないようにしたいと思います。これは少し複雑になります。代わりに [^"]* の代わりに、バックスラッシュも考慮に入れて [^"\\]* . バックスラッシュまたは引用符のどちらかに到達した後、バックスラッシュがあった場合は次の文字を無視するか、次のエスケープされていない引用符に進む必要があります。これは次のようになります。 (\\.|"([^"\\]*\\.)*[^"\\]*") . 組み合わせると、次のようになります。

\+(?=([^"\\]*(\\.|"([^"\\]*\\.)*[^"\\]*"))*[^"]*$)

であることは認めます。 少し 暗号のようなものです。)