首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只有当字符发生4次时,才能找到字符

只有当字符发生4次时,才能找到字符
EN

Stack Overflow用户
提问于 2019-12-04 10:57:53
回答 3查看 295关注 0票数 3

我被困在做这个Regex了。我试着用“向前看”和“向后看”的方法,但我不能在后面使用捕捉组。只有当字符串发生4次时,我才需要从字符串中提取字符。

如果我有这些条件

  • 3346AAAA44
  • 3973BBBBBB44
  • 9755BBBBBBAAAA44

第一个将匹配,因为它有4A的连续。第二个不匹配,因为它有6B在一列。第三次比赛是因为它还有4A。更令人沮丧的是,它可以是从A到Z的任何一个字符发生4次。

定位不重要。

编辑:我在regex上的尝试不起作用。

代码语言:javascript
复制
(([A-Z])\2\2\2)(?<!\2*)(?!\2*)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-12-04 11:04:34

如果允许查找,则在捕获字符后,对\1.进行负查找(因为如果匹配,则匹配的开头与捕获的第一个字符相同)。然后将组反向引用3次,并对\1进行负展望

代码语言:javascript
复制
`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场比赛之后,确保后面没有相同的字符
票数 3
EN

Stack Overflow用户

发布于 2019-12-04 12:06:01

另一个没有查找的版本(请参阅演示)。捕获的4个等号序列将在组2中呈现。

代码语言:javascript
复制
(?:^|(?:(?=(\w)(?!\1))).)(([A-Z])\3{3})(?:(?!\3)|$)
  • (?:^|(?:(?=(\w)(?!\1))).) -确保它是字符串的开头。否则,第二个字符必须不同于第一个字符-如果是,跳过第一个字符。
  • (([A-Z])\3{3})捕获4个重复的[A-Z]字符
  • (?:(?!\3)|$) -确保这4之后的第一个字符是不同的。或者是字符串的结尾

就像这个评论中的bobb-冒泡所暗示的那样,上面的表达式可以简化为(演示):

代码语言:javascript
复制
(?:^|(\w)(?!\1))(([A-Z])\3{3})(?!\3)
票数 2
EN

Stack Overflow用户

发布于 2019-12-04 18:04:10

另一个变体可能是捕获组1中的第一个字符。

断言左边的前2个字符与组1不相同,然后再匹配一个3倍的第1组,即总共4个相同的字符。

然后断言右边的不是第一组。

代码语言:javascript
复制
([A-Z])(?<!\1\1)\1{3}(?!\1)
  • ([A-Z])捕获组1,匹配单个字符A-Z
  • (?<!\1\1)负回顾,断言左边的不是2倍组1
  • \1{3}比赛3次1组
  • (?!\1)断言右边的不是第1组

例如

代码语言:javascript
复制
let pattern = /([A-Z])(?<!\1\1)\1{3}(?!\1)/g;
[
  "3346AAAA44",
  "3973BBBBBB44",
  "9755BBBBBBAAAA44",
  "AAAA",
  "AAAAB",
  "BAAAAB"
].forEach(s =>
  console.log(s + " --> " + s.match(pattern))
);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59174394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档