使用正则表达式在末尾查找除组之外的所有字符

Find all char excluding group at the end with regexp

我有这个字符串:

this is a test

在此字符串的末尾我有一个 space 和新行。 我想提取(用于计数)字符串中没有最后一个 space 的所有 space 组。 使用我的简单正则表达式

/\s+/g

我得到这些组:

this(1)is(2)a(3)test(4)

我想从组中排除第四个 space,因为如果字符串以 space 结尾,我只想得到 3 个组。 正确的正则表达式是什么?

根据正则表达式的风格,您可以使用两种方法。

如果不支持原子 groups/possessive 量词,请使用这样的前瞻解决方案:

(?:\s(?!\s*$))+

regex demo

要点是我们只匹配一个白色space,后面没有0+个其他白色space符号后跟字符串结尾(检查是否使用(?!\s*$) 向前看).

否则,使用

\s++(?!$)

参见another demo。具有原子组的等效表达式是 (?>\s+)(?!$).

在这里,我们只在抓取所有白色 space 之后检查字符串位置的结尾,而不回溯到 \s++ 模式(因此,如果在最后一个 space 之后有字符串的结尾,整个匹配失败)。

此外,借助捕获内部正前瞻然后使用像

这样的反向引用,可以在JavaScript中模拟一个原子组
(?=(\s+))(?!$)

但是,this pattern 在性能方面成本很高。