У меня есть код регулярного выражения, который разделяет строки между [.!?]
, И он работает, но я пытаюсь добавить что-то еще в код регулярного выражения. Я пытаюсь сделать так, чтобы он не совпадал с [.]
Что между числами. Это возможно? Итак, как показано ниже:
$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);
Он включает разделитель в расколе и игнорирует пустые совпадения. Регулярное выражение может быть упрощено до ((?:\d+\.\d+|.*?)[.!?]+)
, Но я думаю, что то, что в приведенном выше примере кода, более эффективно.
[.!?]
Минимум символов?