2

これは正規表現に「簡単に」追加できると思っていましたが、もちろん間違っていることが証明されました...

現在の正規表現は、文字列が記号 (-、$、+、=、(、)、{、}) の場合に true を返します。

(/^[-$+)(}{]$/).test(token);

regEx に代入演算子 (=) と等価演算子 (==) の 2 つの記号を追加したいと考えています。私の直感は、1 つまたは 2 つの「=」を含むトークンが存在する場合に true を返すという行に沿って何かを行うように導きました。

(/^[-$+)(}{]|(=){1,2}$/).test(token);

ただし、実際のトークンが(/^[-$+)(}{]|(=){1,2}$/).test("===")true の場合は返されます。

誰かが私の正規表現の欠点に光を当てることができますか?

ありがとう

4

4 に答える 4

6

微妙な演算子の優先順位の問題に遭遇しました。

/^[-$+)(}{]|(=){1,2}$/

^より$も強くバインドする|ため、これは次と同等です

/(?:^[\-$+)(}{])|(?:={1,2}$)/

おそらく必要なものの代わりに、次のものを^...$囲む必要があり|ます。

/^(?:[\-$+)(}{]|={1,2})$/

または簡略化

/^(?:[\-$+(){}]|==?)$/

/^(?:[\-$+(){}]|==?)$/.test("===") === false;
/^(?:[\-$+(){}]|==?)$/.test("()")  === false;
/^(?:[\-$+(){}]|==?)$/.test("=")   === true;
/^(?:[\-$+(){}]|==?)$/.test("==")  === true;
/^(?:[\-$+(){}]|==?)$/.test("(")   === true;

キャプチャー対非キャプチャー括弧の余談

実際にコンテンツをキャプチャしたい場合を除き、(?:...)より冗長ですが、正規表現を使用するコードへの微妙な影響が少ないため、より好まれます。(...)(?:...)

コンテンツをキャプチャする予定がない場合にキャプチャ グループを使用する場合の問題には、次のようなものがあります。

  1. JS には名前付きグループがないため、既存のグループの番号付けを変更します。
  2. 必要以上の効果を持つ演算子を使用すると、メンテナーが混乱して、何らかの理由でコンテンツをキャプチャしていると考える可能性があります。
  3. リモート ループの動作の変更exec(これは主に Perlish のグローバル マッチの問題ですが、@foo = $str =~ /(foo(bar))/g JS コードが似たようなことをしているのをたまに見かけます)
  4. のような別の場所で定義された (場合によっては可変長の) 置換関数の動作を変更する
    newStr = oldStr.replace(
        正規表現以前に定義された、
        関数 (var_args) {
          return [].slice.call(arguments, 1, arguments.length - 2).join('');
        });
    
于 2013-04-24T16:03:24.307 に答える
4

演算子の優先順位により、 or 分岐には開始 ( ^) と終了 ( $) のゼロ幅の一致が含まれます。= または == をキャッチするには、次を使用する必要があります。

(/^([-$+)(}{]|={1,2})$/).test(token);
于 2013-04-24T15:59:59.467 に答える
1

. . 正規表現の問題は単純です。「^」(で始まる) は「パイプ」の左側にあり、「$」(で終わる) は右側にあります。次のように、正規表現のその部分にのみ適用されます。

^[-$+)(}{]
OR
(=){1,2}$

. . それで、あなたは言っています"_starts with one of these chars_ or _ends with one or two equal signs_"、わかりましたか?

. . あなたが望むのは、次のように、「代替」(パイプ)がその内容にのみ適用されるようにグループを配置することです。

^([-$+)(}{]|={1,2})$

. . 今、あなたはこう言っています: "the text is made of either of _this list of chars_ or _one or two equal signs_".

. Amplexos。

于 2013-04-24T16:08:03.957 に答える