用正则表达式匹配剩余的

Matching leftover with regex

我正在尝试用正则表达式匹配任何不是先前匹配项的内容。

我有以下正则表达式:

(?<return>return)|(?<other>(?![ \n]).*?(?=(?:[\s\n]|$)))

如果我在以下字符串上使用它,我会得到 return 组的一个匹配项

return

但是在下面的字符串中我得到了 other 组:

 return

(注意 return 之前的 space)。

other 的正则表达式不应匹配任何 spaces(或新行)但是(由于 (?![ \n]).

因此,例如,假设我有以下字符串:return abc 123。然后我想使用上面的正则表达式进行 3 场比赛:一场在 return 组中,其中包含“return”,另外两场在 other 组中,其中包含“abc”和“123” “

我似乎无法弄清楚为什么会这样。有人对此有解释吗?我该如何解决这个问题?

您可能会使用

(?<return>return)|(?<other>\S+)

匹配

  • (?<return>return) - 组“return”:return 子串
  • | - 或
  • (?<other>\S+) - “其他”组:一个或多个 non-whitespace 个字符。

如果 return 可以出现在 non-whitespace 块中,您可能希望从第二部分中排除 return(?<return>return)|(?<other>(?:(?!return)\S)+)。参见 demo

如果左边必须有空格或字符串开头,右边必须有空格或字符串结尾,您可以添加空格边界:

(?<!\S)(?:(?<return>return)|(?<other>\S+))(?!\S)

this regex demo