2017-02-21 5 views
1

私が書き込んだpythonスクリプトをjavascriptに変換しています。私のPythonスクリプトは、「\」の単一のインスタンスに一致するように、次の正規表現があります。JavaScriptのネガティブな裏返しの回避策

re.sub(r'(?<!\\)(\\{1})(?!\\)', r'\\', word) 

JSでこれを実行しようとしたとき、私は、コンパイラのエラーを得た:

"Invalid regular expression: /(?<!\\)(\\{1})(?!\\)/: Invalid group" 

をいくつかは、その正規表現を見つけた検索した後jsではルックバックがサポートされていません。

私はthis answerを見て、彼らが使用:負の先読みの形で

^(?!filename).+\.js 

を、私はどこかで'\\''\'を変更する必要があるように私を助けていない文字列の先頭から文字列 私の質問は、文字列の異なるポイントで同じ文字を避けて一致させる方法を決定しようとしているので、これは重複した質問ではないと思いますが、リンクされた質問は特定のフレーズがマッチしないようにしています。

「\」の前後に「\」がない文字に一致する必要があります。

答えて

1

いつでも使用することができますキャプチャグループ

string.match(/(^|[^\\])(\\{1})(?!\\)/)[2] 

let replaced = "a\\b\\\\".replace(/(^|[^\\])(\\{1})(?!\\)/, x => x[0] == '\\' ? x : 'value') 
 

 
console.log(replaced)

あなたがアサーションバック代理でどういう(?<!\\)(\\{1})(?!\\)

+0

これは私がそれらにマッチするのに役立ちますが、エスケープ文字を実際のバックスラッシュに置き換える必要はありません。 – Fruitspunchsamurai

+0

@Fruitspunchsamuraiあなたが交換中にこれをチェックして、編集をチェックすることができます –

0

アサーションなしで一致すると、(^|[^\\])\\([^\\]|$)が返されます。
これは何かをエスケープするかどうかについては何も教えてくれないことに注意してください。
正規表現はより複雑です。代わりに、後読みの

+0

と同じものを返しますか? – Fruitspunchsamurai

+0

ええ、 '/(^ | [^ \\])\\([^ \\] | $)/ g'を探し、' '$ 1 \\\\ $ 2" 'を置き換えてください。どの部分が混乱していますか? – sln