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


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

它使用查找来确定在哪里拆分。它向后看,试图将集合[.!?]中的任何内容匹配一次或多次,只要它前面没有后面有一个数字。

它也不会通过确保最后一集不是字符串的末尾来返回最后一个空匹配。

更新:

这实际上应该更有效:

(?!'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);

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