忽略正则表达式前瞻中的嵌套组

Ignore nested groups in regex lookahead

取以下内容:

More writing. More writing?    More writing!

我想将字符串拆分成句子,每个句子后面都有空格。

因此我想要的结果是:

["More writing.", "More writing?    ", "More writing!"]

在发现 Safari 尚不支持对 Regex 的后视检查后,这是我对先行等价物的尝试。

首先,我反转字符串,然后拆分为:

/(?=\s+!|\s+\?|\s+(?:\.{3}|\.))/g

这有效,除了它多次计算多个空格给出的结果:

 ["More writing. More writing? ", " ", " ", " ", "More writing!"]

如您所见,我现在需要手动折叠空格。

有没有办法将空格作为一个组与前面的句子匹配?

更一般地说:

有没有办法以支持 Safari 的方式实现此目的?

提前致谢。

我认为只匹配 non-sentence-terminators,然后是句子终止符,然后是 0 个或更多空格会更容易:

const str = 'More writing. More writing?    More writing!';
console.log(
  str.match(/[^.!?]+[.!?] */g)
);

您可以匹配至少一个单词后跟 . !? 之一并匹配结尾的空白字符,而不是拆分。

\w+(?:\s+\w+)*[.?!]\s*
  • \w+ 匹配 1+ 个单词字符
  • (?:\s+\w+)* 可选择重复 1+ 个空白字符和 1+ 个单词字符
  • [.?!]\s* 匹配 . ?! 之一和可选的尾随空白字符。

Regex demo

const s = "More writing. More writing?    More writing!";
console.log(s.match(/\w+(?:\s+\w+)*[.?!]\s*/g));