1. ホーム
  2. Web プログラミング
  3. 正規表現

文字列リテラルにマッチするJavaScript正規表現

2022-01-18 02:39:57

この問題に初めて遭遇したのは2年ほど前にコードハイライトを書いた時で、それ以来3世代に渡って解決策が出されています、ガーン。だんだん良くなってきたと思います。

第一世代

プレ {{コード

第2世代。

プレ {コード

第三世代 :

// At that time I was not very proficient in regularity, and I did not have (? :...) I wrote this rule by looking for the closing quotes. The idea is confusing, and there are mistakes.
// For example, a literal like "abc\\\\"", would match "abc\\\\", when the correct result would be "abc\\\\\"".
var re = /('('|. *? ([^\\]'|\\\\'))|"("|. *? ([^\\]"|\\\\")))/g;

ここで、正規表現で非常によく使われるトリックを「先取り」と呼ぶことにしよう。/a|のような正規表現では、先取りをする。/code /pre /div のような正規表現では、より先行する文字が先にマッチするので、いくつかの文字を「先取り」することで多くのトラブルを回避することができます。上の例では、/cheek[˶‾᷄ -̫ ‾᷅˵]/は当然"˶‾᷄"のようなエスケープ文字を優先するので、エスケープ文字の""がマッチに影響する心配がありません。これは局所的な "preemption "ですが、コメント中の文字列や文字列中のコメントなど、より大きな範囲では、関連するマッチが同じルールに書かれている限り、最初に出会ったマッチが優先される必要があります。例えば /(コメント正規)|(文字列正規)/g のように、まずこのように内容をマッチさせてから、さらに処理を行うことができる。

ほとんどの人にはほとんど役に立たないかもしれませんが、もしそうだとしたら?よろしくお願いします〜。