我被困在做这个Regex了。我试着用“向前看”和“向后看”的方法,但我不能在后面使用捕捉组。只有当字符串发生4次时,我才需要从字符串中提取字符。
如果我有这些条件
第一个将匹配,因为它有4A的连续。第二个不匹配,因为它有6B在一列。第三次比赛是因为它还有4A。更令人沮丧的是,它可以是从A到Z的任何一个字符发生4次。
定位不重要。
编辑:我在regex上的尝试不起作用。
(([A-Z])\2\2\2)(?<!\2*)(?!\2*)发布于 2019-12-04 11:04:34
如果允许查找,则在捕获字符后,对\1.进行负查找(因为如果匹配,则匹配的开头与捕获的第一个字符相同)。然后将组反向引用3次,并对\1进行负展望
`3346AAAA44
3973BBBBBB44
9755BBBBBBAAAA44`
.split('\n')
.forEach((str) => {
console.log(str.match(/([a-z])(?<!\1.)\1{3}(?!\1)/i));
});
([a-z]) -捕获一个字符(?<!\1.)负查找:检查捕获组第一个索引处的位置是否前面有两个相同的字符\1{3} -匹配被捕获3次的相同字符(?!\1) --在第4场比赛之后,确保后面没有相同的字符发布于 2019-12-04 12:06:01
发布于 2019-12-04 18:04:10
另一个变体可能是捕获组1中的第一个字符。
断言左边的前2个字符与组1不相同,然后再匹配一个3倍的第1组,即总共4个相同的字符。
然后断言右边的不是第一组。
([A-Z])(?<!\1\1)\1{3}(?!\1)([A-Z])捕获组1,匹配单个字符A-Z(?<!\1\1)负回顾,断言左边的不是2倍组1\1{3}比赛3次1组(?!\1)断言右边的不是第1组例如
let pattern = /([A-Z])(?<!\1\1)\1{3}(?!\1)/g;
[
"3346AAAA44",
"3973BBBBBB44",
"9755BBBBBBAAAA44",
"AAAA",
"AAAAB",
"BAAAAB"
].forEach(s =>
console.log(s + " --> " + s.match(pattern))
);
https://stackoverflow.com/questions/59174394
复制相似问题