正規表現でバックスラッシュをエスケープできないのですか?


114

次の正規表現を使用しています

^[a-zA-Z0-9\',!;\?\$\^:\\\/`\|~&\" @#%\*\{}\(\)_\+\.\s=-]{1,1000}$

私はそれが醜いだ知っているが、これまでのところ、それは私はそれが必要だと思うようにはエスケープされますので、許可されていないバックスラッシュ以外の目的を果たし、私も試した\\の代わりに、\\\同じ結果。何か案は?


4
タイトルのタイプミスを修正しましたが、タイトルに「正規表現で反発を免れることはできないのですか?」確かに!
アダムクロスランド

1
@AdamCrossland正規表現が反発からの脱出に役立つことを願っていますか?> _>
イートンB.

2
一体、私は正規表現からの反発を逃れることができればいいのに。
アダムクロスランド

回答:


225

これをプログラム内の文字列に配置する場合、実際には4つのバックスラッシュを使用する必要がある場合があります(文字列パーサーは文字列に対して「エスケープ解除」するときに2つ削除し、正規表現は2つ必要です。エスケープされた正規表現のバックスラッシュ)。

例えば:

regex("\\\\")

と解釈されます...

regex("\\" [escaped backslash] followed by "\\" [escaped backslash])

と解釈されます...

regex(\\)

単一のバックスラッシュに一致する正規表現として解釈されます。


言語によっては、エスケープシーケンスを解析しない別の形式の引用を使用して、たとえばPythonのように多くを使用する必要がないようにすることができます。

re.compile(r'\\')

r引用符の前には、それになり、生ではないパース、バックスラッシュエスケープをした文字列。


14
へへ...私はこれに遭遇し、3つ追加する必要がありました。機能するまでバックスラッシュを追加し続けました。
ビリーノア2015

うーん、なぜこの正規表現はPCREの場合のように1回ではなく2回再解釈されるのですか?
ジムマイケルズ

3
@JimMichaelsは、すべての言語がエスケープされていない正規表現リテラルを持っているわけではないため、プログラミング言語自体が文字列構文でスラッシュエスケープを一度解釈し、結果の文字列が正規表現エンジンに渡されます(正規表現構文でスラッシュエスケープを解釈します)。
2016

1
昔、私はWindowsファイルパスのみが識別機能である要素のxpathをキャプチャし、xpathを文字列として表すプログラムを(文字列として)生成する必要がありました。中間ステップのある時点で、ファイルパス内の単一のバックスラッシュを表すために使用される8つのバックスラッシュがありました。それは私が今までに得た最高です。
ザックケニオン2017

これは、メタ文字を必要とするパターンと共にバックスラッシュを検索する場合、さらに複雑になる可能性があります。たとえば、バックスラッシュとそれに続く数字を見つけます。今、あなたは何が起こっているのかを理解しようとする次の表現を見つめていますnew RegExp('\\\\\\d');
ジャバッケッタ

15

それがリテラルでない場合は、エスケープされたバックスラッシュを意味する\\\\ように使用する必要が\\あります。

これは、2つの表現があるためです。正規表現の文字列表現には、があります"\\\\"。これは、パーサーに送信されるものです。パーサーは\\、有効なエスケープされた円記号(単一の円記号と一致)として解釈するものを確認します。


10

バックスラッシュ\は正規表現のエスケープ文字です。したがって、二重の円記号は、実際には単一の文字通りの円記号を意味します。

\ (backslash) followed by any of [\^$.|?*+(){} escapes the special character to suppress its special meaning.

ref:http : //www.regular-expressions.info/reference.html


4

http://www.regular-expressions.info/charclass.htmlから:

文字クラス内の特殊文字またはメタ文字は、閉じ括弧(])、円記号(\\)、キャレット(^)、およびハイフン(-)のみであることに注意してください。通常のメタ文字は、文字クラス内の通常の文字であり、バックスラッシュでエスケープする必要はありません。スターまたはプラスを検索するには、[+ *]を使用します。文字クラス内の通常のメタ文字をエスケープする場合、正規表現は正常に機能しますが、そうすると可読性が大幅に低下します。

文字クラス内にバックスラッシュを特別な意味のない文字として含めるには、別のバックスラッシュでエスケープする必要があります。[\\ x]はバックスラッシュまたはxに一致します。閉じ括弧(])、キャレット(^)、ハイフン(-)は、バックスラッシュでエスケープするか、特別な意味を持たない位置に配置することで含めることができます。読みやすさが向上するため、後者の方法をお勧めします。キャレットを含めるには、開始ブラケットの直後以外の場所にキャレットを置きます。[x ^]は、xまたはキャレットと一致します。開始ブラケットの直後に終了ブラケットまたは否定キャレットを置くことができます。[] x]は閉じ括弧またはxと一致します。[^] x]は、閉じ括弧またはxではない任意の文字に一致します。ハイフンは、開始ブラケットの直後、終了ブラケットの直前、または否定キャレットの直後に含めることができます。

正規表現を何語で書いていますか?


0

このソリューションは、brタグを '\ n'に置き換える際の問題を修正しました。

alert(content.replace(/<br\/\>/g,'\n'));
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.