我只是不断地用这个撞墙,我无法解决它。我正在尝试获得一个执行如下的正则表达式:
(axb|cxd)
除非在表达式中不重复 x(因为它确实是长编码匹配表达式)。这是针对一个大字符串进行测试的,在该字符串中我只需要匹配 x 即可进行字符串替换,因此可以选择零宽度向前/向后。有任何想法吗?
a、b、c 和 d 相当小,因此如果它使表达式更易于形成,它们可以重复。
提前致谢。
我只是不断地用这个撞墙,我无法解决它。我正在尝试获得一个执行如下的正则表达式:
(axb|cxd)
除非在表达式中不重复 x(因为它确实是长编码匹配表达式)。这是针对一个大字符串进行测试的,在该字符串中我只需要匹配 x 即可进行字符串替换,因此可以选择零宽度向前/向后。有任何想法吗?
a、b、c 和 d 相当小,因此如果它使表达式更易于形成,它们可以重复。
提前致谢。
没有简单的方法解决它。你必须做这样的事情:
var x = "long, complicated regular expression";
var re = new RegExp("a" + x + "b|c" + x + "d");
如果您真的不想在正则表达式中重复 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
}