使用正则表达式不匹配数字之间的句点
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+|.*?)[.!?]+)
,但我认为上面的代码示例中的内容更有效。
我有一个在 [.!?]
之间拆分字符串的正则表达式代码,它可以工作,但我正在尝试向正则表达式代码添加其他内容。我试图让它与数字之间的 [.]
不匹配。那可能吗?所以,就像下面的例子:
$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+|.*?)[.!?]+)
,但我认为上面的代码示例中的内容更有效。