使用正则表达式在末尾查找除组之外的所有字符
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*$))+
要点是我们只匹配一个白色space,后面没有0+个其他白色space符号后跟字符串结尾(检查是否使用(?!\s*$)
向前看).
否则,使用
\s++(?!$)
参见another demo。具有原子组的等效表达式是 (?>\s+)(?!$)
.
在这里,我们只在抓取所有白色 space 之后检查字符串位置的结尾,而不回溯到 \s++
模式(因此,如果在最后一个 space 之后有字符串的结尾,整个匹配失败)。
此外,借助捕获内部正前瞻然后使用像
这样的反向引用,可以在JavaScript中模拟一个原子组
(?=(\s+))(?!$)
但是,this pattern 在性能方面成本很高。
我有这个字符串:
this is a test
在此字符串的末尾我有一个 space 和新行。 我想提取(用于计数)字符串中没有最后一个 space 的所有 space 组。 使用我的简单正则表达式
/\s+/g
我得到这些组:
this(1)is(2)a(3)test(4)
我想从组中排除第四个 space,因为如果字符串以 space 结尾,我只想得到 3 个组。 正确的正则表达式是什么?
根据正则表达式的风格,您可以使用两种方法。
如果不支持原子 groups/possessive 量词,请使用这样的前瞻解决方案:
(?:\s(?!\s*$))+
要点是我们只匹配一个白色space,后面没有0+个其他白色space符号后跟字符串结尾(检查是否使用(?!\s*$)
向前看).
否则,使用
\s++(?!$)
参见another demo。具有原子组的等效表达式是 (?>\s+)(?!$)
.
在这里,我们只在抓取所有白色 space 之后检查字符串位置的结尾,而不回溯到 \s++
模式(因此,如果在最后一个 space 之后有字符串的结尾,整个匹配失败)。
此外,借助捕获内部正前瞻然后使用像
这样的反向引用,可以在JavaScript中模拟一个原子组(?=(\s+))(?!$)
但是,this pattern 在性能方面成本很高。