有没有办法在不限制捕获内容的情况下限制正则表达式中匹配的字符

Is there a way to limit the characters that are matched in a regular expression without limiting what is captured

我想要达到的目标 给出下面的三个字符串,我试图将 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 - I don't want to match that second 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

你可以使用

^.*?([ftY]).*?(?!)([ftY]).*?(?!|)([ftY])

regex demo。这三个字母将落入三个单独的捕获组。

详情:

  • ^ - 字符串开头
  • .*? - 除换行字符外的任何零个或多个字符,尽可能少
  • ([ftY]) - 第 1 组:ftY
  • .*? - 除换行字符外的任何零个或多个字符,尽可能少
  • (?!)([ftY]) - 第 2 组:ftY,但不是第 1 组中捕获的值
  • .*? - 除换行字符外的任何零个或多个字符,尽可能少
  • (?!|)([ftY]) - 第 3 组:ftY,但不是第 1 组和第 2 组中捕获的值。