3

私はこの正規表現を持っています:

new RegExp("^[a-z 0-9\"\-\`]+$", "ig")

そして私は動作することを想定していない文字列をテストしています:'#vc'

しかし、それはテストに合格します:(そしてそれは(#))であってはなりません

new RegExp("^[a-z 0-9\"\-\`]+$", "ig").test('#vc') //true

\"しかし、または\-またはのいずれかを削除する\`と、機能します(テストは正常に失敗します)。

私は何を間違っているのですか?

私の正規表現は、英語、数字、スペース、["]、[-] [、[`]を検索するだけです。

4

1 に答える 1

5

コンストラクターを使用する場合、エスケープには 2 つのレイヤーがあるため、エスケープを 2 倍RegExpにする必要があります。JavaScript 文字列リテラルでのエスケープと、正規表現構文でのエスケープです。

ただし、あなたの場合、まったくエスケープせずに正規表現を書くことは可能です。

あなたの場合、リテラルRegExp/を使用するだけでよく、正規表現構文でのエスケープと、正規表現に現れるものをエスケープすることだけを気にする必要があります(/リテラルの区切り文字として使用されるためRegExp

/^[a-z 0-9"\-`]+$/gi

別の方法は次のとおりです。

/^[a-z 0-9"`-]+$/gi

-文字クラスの最後にある場合は、ダッシュをエスケープする必要はありません。このようにして、すべてのエスケープと混同する必要はありません。

または、引き続きコンストラクターを使用する場合は、文字列でRegExp指定するエスケープを 2 倍にする必要があります。\

new RegExp('^[a-z 0-9"\\-`]+$', "ig")

-または、文字クラスの最後に指定されている別のバージョンを使用するだけです。

new RegExp('^[a-z 0-9"`-]+$', "ig")

文字列でエスケープする必要がないように、文字列の引用符を から に変更していることに注意して"ください。何らかの理由で を好む場合は、リテラル文字列レベルでエスケープします。'"""

new RegExp("^[a-z 0-9\"`-]+$", "ig")

現在の正規表現については

new RegExp("^[a-z 0-9\"\-\`]+$", "ig")

と同等です

/^[a-z 0-9"-`]+$/gi

"からまでの文字範囲`が含まれていることがわかります。これは、0x22 から 0x60 までの ASCII コードを持つすべての文字が含まれ、#たまたまその範囲内にあることを意味します。

パターンが目的のものかどうかを確認するには、いつでもsource正規表現のプロパティを呼び出して、正規表現のソース文字列を取得できます。

于 2013-03-19T10:17:52.653 に答える