Использование регулярных выражений для несовпадения периодов между числами

1

У меня есть код регулярного выражения, который разделяет строки между [.!?], И он работает, но я пытаюсь добавить что-то еще в код регулярного выражения. Я пытаюсь сделать так, чтобы он не совпадал с [.] Что между числами. Это возможно? Итак, как показано ниже:

$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. )
  • 0
    У вас действительно есть точка в 4.000? Есть ли между символами [.!?] Минимум символов?
  • 0
    @bodruk Гм. Точка находится между 4 и 0? Вы даже напечатали это: 4.000.
Теги:
preg-split

1 ответ

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+|.*?)[.!?]+), Но я думаю, что то, что в приведенном выше примере кода, более эффективно.

  • 0
    О нет. Строка может начинаться или заканчиваться цифрой. Только не окруженные ОБА стороны с цифрами.
  • 0
    Это работает, но на моем оригинальном регулярном выражении, если было что-то вроде этого: $ input = "one.two!? !! three? 4.000."; с дополнительным!? ...! между словами, он не включает их в массив. Таким образом, массив будет содержать два!? !! в отличие от двух! ? ! ! в разных показателях.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню