首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >是否有一种方法可以限制正则表达式中匹配的字符而不限制捕获的字符?

是否有一种方法可以限制正则表达式中匹配的字符而不限制捕获的字符?
EN

Stack Overflow用户
提问于 2022-04-25 20:04:41
回答 1查看 39关注 0票数 2

给出下面的三个字符串,我试图在每个字符串的开头匹配Y tf。

代码语言:javascript
代码运行次数:0
运行
复制
15 YstfAWIN25  desired matches ->  Y tf
15 YstfMSIN25  desired matches ->  Y tf
15 Ystf20IN25  desired matches ->  Y tf

这个正则表达式(ftY)符合我的目标,但是,它太脆弱了,如果对字符串做一些微小的更改,就会产生错误的结果。例如,15 YstfMYIN25将导致以下匹配Y tf Y -我不想匹配第二个Y。

因此,我尝试使用一个非捕获组来限制匹配的字符。

代码语言:javascript
代码运行次数:0
运行
复制
([ftY])(?:AW|MS|\d+)

当第二个Y (15 YstfMYIN25)包含在完整字符串中时,此正则表达式将产生以下匹配:

代码语言:javascript
代码运行次数:0
运行
复制
15 YstfMYIN25  desired matches ->  f

捕获组的添加使得表达式跳过Y和t,我确实玩过让捕获组变得贪婪和非捕获组懒惰,但是我得到了相同的结果。是否有办法使用非捕获组(或其他方式)限制可以捕获的字符,并仍然捕获所有感兴趣的字符?只在这间豪华的Y。

我有以下几个例子:

https://regex101.com/r/EDPqsl/1 https://regex101.com/r/R1tiXz/1

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-25 21:46:44

您可以使用

代码语言:javascript
代码运行次数:0
运行
复制
^.*?([ftY]).*?(?!\1)([ftY]).*?(?!\1|\2)([ftY])

regex演示。这三个字母将分成三个独立的捕获组。

详细信息

  • ^ -字符串的开始
  • .*? -除断行字符以外的任何零或多个字符,尽可能少。
  • ([ftY]) -第一组:ft还是Y
  • .*? -除断行字符以外的任何零或多个字符,尽可能少。
  • (?!\1)([ftY]) -第2组:ftY,但不包括在组1中捕获的值
  • .*? -除断行字符以外的任何零或多个字符,尽可能少。
  • (?!\1|\2)([ftY]) -第3组:ftY,但不包括在组1和组2中捕获的值。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72005170

复制
相关文章

相似问题

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