使用正则表达式不匹配数字之间的句点

Using regex to not match periods between numbers

我有一个在 [.!?] 之间拆分字符串的正则表达式代码,它可以工作,但我正在尝试向正则表达式代码添加其他内容。我试图让它与数字之间的 [.] 不匹配。那可能吗?所以,就像下面的例子:

$input = "one.two!three?4.000.";
$inputX = preg_split("~(?>[.!?]+)\K(?!$)~", $input); 

print_r($inputX);

结果:

Array ( [0] => one. [1] => two! [2] => three? [3] => 4. [4] => 000. )

需要结果:

Array ( [0] => one. [1] => two! [2] => three? [3] => 4.000. )

你应该可以就此进行拆分:

(?<=(?<!\d(?=[.!?]+\d))[.!?])(?![.!?]|$)

https://regex101.com/r/kQ6zO4/1

它使用环视来确定拆分位置。它向后看以尝试匹配集合 [.!?] 一次或多次 中的任何内容,只要它前面没有 后跟一个数字。

通过确保最后一组不是字符串的末尾,它也不会 return 最后一个空匹配。

更新:

这实际上应该更有效率:

(?!\d+\.\d+).+?[.!?]+\K(?!$)

https://regex101.com/r/eN7rS8/1

这是使用正则表达式的另一种可能性 flags:

$input = "one.two!three???4.000.";
$inputX = preg_split("~(\d+\.\d+[.!?]+|.*?[.!?]+)~", $input, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); 

print_r($inputX);

它在拆分中包含定界符并忽略空匹配。正则表达式可以简化为 ((?:\d+\.\d+|.*?)[.!?]+),但我认为上面的代码示例中的内容更有效。