次の正規表現を使用しています
^[a-zA-Z0-9\',!;\?\$\^:\\\/`\|~&\" @#%\*\{}\(\)_\+\.\s=-]{1,1000}$
私はそれが醜いだ知っているが、これまでのところ、それは私はそれが必要だと思うようにはエスケープされますので、許可されていないバックスラッシュ以外の目的を果たし、私も試した\\
の代わりに、\\\
同じ結果。何か案は?
次の正規表現を使用しています
^[a-zA-Z0-9\',!;\?\$\^:\\\/`\|~&\" @#%\*\{}\(\)_\+\.\s=-]{1,1000}$
私はそれが醜いだ知っているが、これまでのところ、それは私はそれが必要だと思うようにはエスケープされますので、許可されていないバックスラッシュ以外の目的を果たし、私も試した\\
の代わりに、\\\
同じ結果。何か案は?
回答:
これをプログラム内の文字列に配置する場合、実際には4つのバックスラッシュを使用する必要がある場合があります(文字列パーサーは文字列に対して「エスケープ解除」するときに2つ削除し、正規表現は2つ必要です。エスケープされた正規表現のバックスラッシュ)。
例えば:
regex("\\\\")
と解釈されます...
regex("\\" [escaped backslash] followed by "\\" [escaped backslash])
と解釈されます...
regex(\\)
単一のバックスラッシュに一致する正規表現として解釈されます。
言語によっては、エスケープシーケンスを解析しない別の形式の引用を使用して、たとえばPythonのように多くを使用する必要がないようにすることができます。
re.compile(r'\\')
r
引用符の前には、それになり、生ではないパース、バックスラッシュエスケープをした文字列。
new RegExp('\\\\\\d');
。
それがリテラルでない場合は、エスケープされたバックスラッシュを意味する\\\\
ように使用する必要が\\
あります。
これは、2つの表現があるためです。正規表現の文字列表現には、があります"\\\\"
。これは、パーサーに送信されるものです。パーサーは\\
、有効なエスケープされた円記号(単一の円記号と一致)として解釈するものを確認します。
バックスラッシュ\
は正規表現のエスケープ文字です。したがって、二重の円記号は、実際には単一の文字通りの円記号を意味します。
\ (backslash) followed by any of [\^$.|?*+(){} escapes the special character to suppress its special meaning.
http://www.regular-expressions.info/charclass.htmlから:
文字クラス内の特殊文字またはメタ文字は、閉じ括弧(])、円記号(\\)、キャレット(^)、およびハイフン(-)のみであることに注意してください。通常のメタ文字は、文字クラス内の通常の文字であり、バックスラッシュでエスケープする必要はありません。スターまたはプラスを検索するには、[+ *]を使用します。文字クラス内の通常のメタ文字をエスケープする場合、正規表現は正常に機能しますが、そうすると可読性が大幅に低下します。
文字クラス内にバックスラッシュを特別な意味のない文字として含めるには、別のバックスラッシュでエスケープする必要があります。[\\ x]はバックスラッシュまたはxに一致します。閉じ括弧(])、キャレット(^)、ハイフン(-)は、バックスラッシュでエスケープするか、特別な意味を持たない位置に配置することで含めることができます。読みやすさが向上するため、後者の方法をお勧めします。キャレットを含めるには、開始ブラケットの直後以外の場所にキャレットを置きます。[x ^]は、xまたはキャレットと一致します。開始ブラケットの直後に終了ブラケットまたは否定キャレットを置くことができます。[] x]は閉じ括弧またはxと一致します。[^] x]は、閉じ括弧またはxではない任意の文字に一致します。ハイフンは、開始ブラケットの直後、終了ブラケットの直前、または否定キャレットの直後に含めることができます。
正規表現を何語で書いていますか?