3

我只是不断地用这个撞墙,我无法解决它。我正在尝试获得一个执行如下的正则表达式:

(axb|cxd)

除非在表达式中不重复 x(因为它确实是长编码匹配表达式)。这是针对一个大字符串进行测试的,在该字符串中我只需要匹配 x 即可进行字符串替换,因此可以选择零宽度向前/向后。有任何想法吗?

a、b、c 和 d 相当小,因此如果它使表达式更易于形成,它们可以重复。

提前致谢。

4

2 回答 2

1

没有简单的方法解决它。你必须做这样的事情:

var x = "long, complicated regular expression";
var re = new RegExp("a" + x + "b|c" + x + "d");
于 2011-11-25T03:42:29.103 回答
1

如果您真的不想在正则表达式中重复 x,那么您将不得不应用一些手动搜索逻辑。您可以使用正则表达式搜索 x,然后根据找到它的位置,在它之前查找 a 和在它之后查找 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 包含两次并让正则表达式引擎为您完成这项肮脏的工作会更容易:

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

或者,如果将 x 放入字符串两次太麻烦,则使用 javascript 字符串数学自己构建正则表达式:

var x = "long complicated regex";
var re = new RegExp("a" + x + "b|c" + x + "d");
if (str.match(re)) {
    // found match
}
于 2011-11-25T04:43:49.303 回答