我有一个这样的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
复制相似问题