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

时间:2015-10-30 00:35:48

标签: php regex preg-split

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

$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. )

1 个答案:

答案 0 :(得分:3)

你应该可以分开:

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

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