Как разделить строку по sla sh, который не между числами? - PullRequest
2 голосов
/ 10 апреля 2020

Как разделить строку на sla sh, которая не находится между числами? Я использую функцию preg_split ниже:

$splitted = preg_split('#[/\\\\\_\s]+#u', $string);

Ввод: "925/123 Black/Jack"

Сплит-результат сейчас:

[
    0 => '925',
    1 => '123',
    2 => 'Black',
    3 => 'Jack'
]

Сплит-результат Я хочу:

[
    0 => '925/123',
    1 => 'Black',
    2 => 'Jack'
]

Ответы [ 3 ]

1 голос
/ 10 апреля 2020

Вы можете использовать

preg_split('#(?:[\s\\\\_]|(?<!\d)/(?!\d))+#u', '925/123 Black/Jack')

См. PHP demo и regex demo и график регулярных выражений:

enter image description here

Подробности

  • (?: - начало группы без захвата:
    • [\s\\_] - пробел, \ или _
    • | - или
    • (?<!\d)/(?!\d) - /, не заключенный в цифры
  • )+ - конец группы без захвата, повторите 1 или более раз.
1 голос
/ 10 апреля 2020

Ваше регулярное выражение излишне сложно. Вам нужно разделить вашу строку на:

  • либо пробел (может быть, в более общем случае - последовательность белых символов),
  • или sla sh
    • без предшествующего ди git (отрицательный взгляд сзади),
    • без последующего ди git (отрицательный взгляд вперед).

Итак, регулярное выражение, которое вам нужно (заключено в # символов с двойными обратными слешами):

#(?<!\\d)/(?!\\d)|\\s+#

Пример кода:

$string = "925/123 Black/Jack";
$pattern = "#(?<!\\d)/(?!\\d)|\\s+#";
$splitted = preg_split($pattern, $string);
print_r($splitted);

печатает только то, что вы хотите:

Array
(
    [0] => 925/123
    [1] => Black
    [2] => Jack
)
1 голос
/ 10 апреля 2020

Один из вариантов - совпадение 1 или более цифр, разделенных на прямую sla sh с пробелами слева и справа.

Затем используйте SKIP FAIL и совпадение 1 или больше раз, что указано в классе персонажа. Обратите внимание, что вам не нужно экранировать подчеркивание.

(?<!\S)\d+(?:/\d+)+(?!\S)(*SKIP)(*F)|[/\\_\s]+

Пояснение

  • (?<!\S)\d+(?:/\d+)+(?!\S) Совпадение повторяющегося числа цифр между косыми чертами
  • (*SKIP)(*F) Пропустить
  • | Или
  • [/\\_\s]+ Совпадение 1+ вхождений любого из перечисленных

Regex демо | Php демо

Например

$string = "925/123 Black/Jack";
$pattern = "#(?<!\S)\d+(?:/\d+)+(?!\S)(*SKIP)(*F)|[/\\\\_\s]+#u";
$splitted = preg_split($pattern, $string);
print_r($splitted);

Выход

Array
(
    [0] => 925/123
    [1] => Black
    [2] => Jack
)
...