微妙な演算子の優先順位の問題に遭遇しました。
/^[-$+)(}{]|(=){1,2}$/
^
より$
も強くバインドする|
ため、これは次と同等です
/(?:^[\-$+)(}{])|(?:={1,2}$)/
おそらく必要なものの代わりに、次のものを^...$
囲む必要があり|
ます。
/^(?:[\-$+)(}{]|={1,2})$/
または簡略化
/^(?:[\-$+(){}]|==?)$/
/^(?:[\-$+(){}]|==?)$/.test("===") === false;
/^(?:[\-$+(){}]|==?)$/.test("()") === false;
/^(?:[\-$+(){}]|==?)$/.test("=") === true;
/^(?:[\-$+(){}]|==?)$/.test("==") === true;
/^(?:[\-$+(){}]|==?)$/.test("(") === true;
キャプチャー対非キャプチャー括弧の余談
実際にコンテンツをキャプチャしたい場合を除き、(?:...)
より冗長ですが、正規表現を使用するコードへの微妙な影響が少ないため、より好まれます。(...)
(?:...)
コンテンツをキャプチャする予定がない場合にキャプチャ グループを使用する場合の問題には、次のようなものがあります。
- JS には名前付きグループがないため、既存のグループの番号付けを変更します。
- 必要以上の効果を持つ演算子を使用すると、メンテナーが混乱して、何らかの理由でコンテンツをキャプチャしていると考える可能性があります。
- リモート ループの動作の変更
exec
(これは主に Perlish のグローバル マッチの問題ですが、@foo = $str =~ /(foo(bar))/g
JS コードが似たようなことをしているのをたまに見かけます)
- のような別の場所で定義された (場合によっては可変長の) 置換関数の動作を変更する
newStr = oldStr.replace(
正規表現以前に定義された、
関数 (var_args) {
return [].slice.call(arguments, 1, arguments.length - 2).join('');
});