2

正規表現に「リテラルの開き括弧」を含めるには、他の文字の中でも開き括弧「(」をエスケープする (バックスラッシュを前に付ける) 必要があることは明らかです。の。

しかし、閉じ括弧 ")" にも同じことが当てはまるのはなぜでしょうか? リードイン トークンとして ")" を持つ構文構造はありませんね。

では、なぜ閉じ括弧を文字どおりに解釈するためにエスケープする必要があるのでしょうか。

もちろん、他の閉じ括弧についても同じ質問をすることができます。

「どうしてこうなの?」ですみません。質問。答えられない可能性もあります。しかし、正当な理由がある場合それを知る唯一の方法は尋ねることです!

補遺: この質問の根拠は次のとおりです。プレフィックスは必要ありません。

そして、ほとんどの場合、閉じ括弧にプレフィックスを付ける必要はありません。開き括弧のない閉じ括弧は正規表現グループの一部ではないため、とにかくこの場合にエスケープする必要があることはまったく論理的ではありません。

4

3 に答える 3

6

閉じ括弧を保持するグループを一致させたいとします。エスケープしないと、これは次のようになります())。ブラケットのようにエスケープする(\))と、正規表現を正確かつ明確に解析することが (可能でなくても) はるかに簡単になります。

(エスケープされていない) 正規表現(\w))では、閉じ括弧はグループに属してい)ますか? たとえば、文字列 のabc)d場合、それは一致しますcc)?

もちろん、意味が曖昧でない場合 (および正規表現パーサーで許可されている場合) には、エスケープ文字の一部を省略できますが、それは何の助けになるでしょうか? あちこちで文字を保存しますが、特殊文字に遭遇するたびに、)「これは制御文字ですか、それとも照合する文字ですか?あいまいですか?」と考える必要があります。明確で一貫性のあるものにすることをお勧めします。

于 2013-09-23T12:15:30.007 に答える
2

tobias_kの回答のより具体的な例として:

次の正規表現を見てください。

(a*))

文字列bbaaa)bbを見て、キャプチャしますaaaaaa)

結果は明らかです

(a*\))

(a*)\)
于 2013-09-23T12:20:18.677 に答える
1

もちろん、他の閉じ括弧についても同じ質問をすることができます。

いいえ、それは正しくありません (または、正規表現エンジンごとに異なる場合があります)。

Javascript 正規表現エンジンでは、エスケープする必要はありません]}

次の例を参照してください。

var x = 'brackets)}]';

x.match(/]/); // works

x.match(/}/); // works

x.match(/)/); // failes

ケース3の場合のみ、エラーで失敗しますUnmatched ')'

于 2013-09-23T12:23:17.047 に答える