中間表現を繰り返さない正規表現(axb | cxd)

私はちょうどこれに壁を打っているだけで、私はそれを解決することはできません。私は次のように実行する正規表現を取得しようとしています:

(axb|cxd)

expression内でxを繰り返さない限り(これは本当に長いエンコーディング一致式であるため)これは、文字列置換のためにxをマッチングする必要がある大きな文字列に対してテストされるので、ゼロ幅の先読み/後ろはオプションです。何か案は?

a、b、c、dは合理的に小さいので、表現が簡単になると繰り返すことができます。

前もって感謝します。

3
これは多くの正規表現のフレーバではかなり簡単ですが、JavaScriptには必要な機能がありません。純粋な正規表現の解決策は可能かもしれませんが、非常に醜い正規表現です。
追加された 著者 Alan Moore,
(a | c)x(b | d)パターンを使用して、 axd パターンと実際に一致していないことを確認することは難しいでしょう。 code>または cxb
追加された 著者 jswolf19,
何語?答えはあなたの正規表現の変形に応じて変わる可能性があります。
追加された 著者 porges,
私は知っている、それは私が私の答えを削除した理由です
追加された 著者 Chris Laplante,
Javascript。それが.NETにも移植されていれば、それは一緒に演奏されるので便利ですが、今はJavascriptのみの表現があれば幸せになれます。
追加された 著者 Blueshift,
@SimpleCoderはaxdとcxbに一致します。これらの2つのケースを除いて、私が見ていないトリックです。 (申し訳ありませんが、コメントシステムは私にここで返信することができます)
追加された 著者 Blueshift,
@ jswolf19これまでに見た最も可能性の高いパスは、(a | c)(x)(b | d)でスクリプトの\ 1と\ 3の結果を確認します。ちょうど表現を見て、それは私が見落としていた解決された(複雑ではあるが)かもしれないと思った構造の非常に初歩的なようだった。私はこの構造がたくさん出てくると思います。
追加された 著者 Blueshift,

2 答え

本当に正規表現でxを繰り返さない場合は、手動検索ロジックを適用する必要があります。 xを正規表現で検索し、見つかった場所に基づいて、その前にbを、それの後にbを、それの前にcを、それの後にdを検索することができます。しかし、これは、Gabeの答えのように正規表現で繰り返すだけではなく、より多くの作業になるでしょう。

たとえば、これを行うことができます:

var re = /(a|c)x(b|d)/;
var matches = str.match(re);
if (matches) {
   //exclude axd or cxb
    if ((matches[1] + matches[2]).match(/ab|cd/)) {
       //found axb or cxd
    }
}

しかし、正直言って、xを2回インクルードして、正規表現エンジンがあなたのために汚い作業をするのは簡単だろう。

if (str.match(axb|cxd)) {
   //found match
}

または、xを文字列に2回入れるのが面倒な場合は、javascript string mathを使用して正規表現を自分で作成します。

var x = "long complicated regex";
var re = new RegExp("a" + x + "b|c" + x + "d");
if (str.match(re)) {
   //found match
}
1
追加された

その周りに簡単な方法はありません。次のようなことをしなければなりません:

var x = "long, complicated regular expression";
var re = new RegExp("a" + x + "b|c" + x + "d");
1
追加された
JavaScript - 日本のコミュニティ
JavaScript - 日本のコミュニティ
2 参加者の

日本人コミュニティのjavascript