我有一个这样的RegExp:
/(?!xx)x.+?(?!xx)x/g我测试了三个示例字符串。我用^标记了预期的匹配。
期望:
应与0-5匹配
x...x
^^^^^不应匹配
xx...xx应与2-7匹配:
xxx...xxx
^^^^^应与3-8匹配:
xxxx...xxxx
^^^^^我的问题是:
我还没有找到一种在不匹配xx的情况下匹配x的方法,我也没有什么想法可以尝试了。请帮帮我。这是当前的结果:https://regex101.com/r/OqSMuO/5
提前谢谢你!
发布于 2018-05-17 04:09:37
我觉得这符合你的意图。
^(?:(x[^x]{3}x)|x{2,}(x[^x]{3}x)x{2,})$它被分成两部分,或者合在一起:
(x[^x]{3}x)与x...x的大小写完全匹配
x{2,}(x[^x]{3}x)x{2,}与xxx...xxx匹配,但与xx...xx不匹配
注意:这对不平衡匹配没有帮助。例如,(xxx...xxxx)仍然与正则表达式匹配。然而,据我所知,您不能仅仅使用正则表达式来解决这个问题。为此,您需要一个堆栈。
发布于 2018-05-18 02:09:08
如果前导次数x应该与尾随次数相同,则可以使用backreference来捕获组1:
从字符串^的开头开始,在组1中捕获0次或更多次x。然后在组2中捕获x,一次或多次不是x,后面跟着使用否定字符类的x (x[^x]+x)。此组将包含您的匹配项。
最后,使用反向引用\1再次匹配与组1中相同的值,并断言字符串$的结尾。
const strings = [
"x...x",
"xx...x",
"xx...",
"xx..xx",
"xxx...xxx",
"xxxx...xxxx",
];
let pattern = /^(x*)(x[^x]+x)(\1)$/;
strings.forEach((s) => {
let res = s.match(pattern);
if (res) {
console.log(s + " --> " + s.match(pattern)[2]);
} else {
console.log(s + " --> no match.");
}
});
发布于 2018-05-18 16:54:03
这将捕获除以两个"xx“(xx...xx)开头的x...x之外的所有其他one。
(?:^x{0}|x{2,})(x...x)https://stackoverflow.com/questions/50378996
复制相似问题