给出下面的三个字符串,我试图在每个字符串的开头匹配Y tf。
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。
因此,我尝试使用一个非捕获组来限制匹配的字符。
([ftY])(?:AW|MS|\d+)
当第二个Y (15 YstfMYIN25)包含在完整字符串中时,此正则表达式将产生以下匹配:
15 YstfMYIN25 desired matches -> f
捕获组的添加使得表达式跳过Y和t,我确实玩过让捕获组变得贪婪和非捕获组懒惰,但是我得到了相同的结果。是否有办法使用非捕获组(或其他方式)限制可以捕获的字符,并仍然捕获所有感兴趣的字符?只在这间豪华的Y。
我有以下几个例子:
https://regex101.com/r/EDPqsl/1 https://regex101.com/r/R1tiXz/1
发布于 2022-04-25 21:46:44
您可以使用
^.*?([ftY]).*?(?!\1)([ftY]).*?(?!\1|\2)([ftY])
见regex演示。这三个字母将分成三个独立的捕获组。
详细信息
^
-字符串的开始.*?
-除断行字符以外的任何零或多个字符,尽可能少。([ftY])
-第一组:f
,t
还是Y
.*?
-除断行字符以外的任何零或多个字符,尽可能少。(?!\1)([ftY])
-第2组:f
、t
或Y
,但不包括在组1中捕获的值.*?
-除断行字符以外的任何零或多个字符,尽可能少。(?!\1|\2)([ftY])
-第3组:f
、t
或Y
,但不包括在组1和组2中捕获的值。https://stackoverflow.com/questions/72005170
复制相似问题