web-dev-qa-db-ja.com

FirefoxでJavascript正規表現ネガティブ後読みが機能しない

次のjavascript正規表現を変更する必要があります。これはnegative lookbehindで、Firefoxでエラーがスローされるためです。

content = content.replace(/(?![^<]*>)(?:[\"])([^"]*?)(?<!=)(?:[\"])(?!>)/g, '„$1“');

誰もがアイデアを持っているし、私を助けることができますか?

前もって感謝します!

9
Cla

LookbehindsはECMA2018標準をサポートするブラウザーでのみ使用できます。つまり、Chromeの最新バージョンのみがそれらを処理できます。

大半のブラウザをサポートするには、パターンを先読みのみを使用するように変換します。

(?<!=)負の後読みは、現在の場所のすぐ左に=がないことを確認します。 [^"]は、その文字と一致するatomです(?量指定子はオプションになりますが、"の前にある[^"]は可能です] tは=であり、その位置を制限する必要はありません)。

だから、あなたは使うことができます

content = content.replace(/(?![^<]>)"([^"=]?)"(?!>)/g, '„$1"');
                                      ^^^^^

(?:[\"])"と等しいことに注意してください。 [^"=]?は、"および=以外の文字の1回または0回の出現に一致します。

regex demo を参照してください。

14

正規表現(?![^<]*>)"([^"]*?)(?<!=)"(?!>)

後読みのアサーションなしでは:

(?![^<]*>)"((?:[^"=]+|=(?!"))*)"(?!>)

読みやすいバージョン

 (?! [^<]* > )
 "
 (                             # (1 start)
      (?:
           [^"=]+ 
        |  
           = 
           (?! " )
      )*
 )                             # (1 end)
 "
 (?! > )

これはあなたが選んだ答えとは異なり、notと同等です。

3
user557597

後読みのアサーションはES2018の一部です。これらはまだFirefoxでサポートされていないため、エラーが発生します。

Chromeはバージョン 62 以降でサポートしています。Node.js6.4以上でハーモニーフラグを使用するか、9以上でフラグなしで使用できます。

提案を確認できます here &browser support here

2