Упростите группы соответствия регулярному выражению с помощью захвата [дубликата]

1

Я пытаюсь сопоставить такие типы строк (5 разных строк).

|n||0||0||0||0|
|n||n||0||0||0|
|n||n||n||0||0|
|n||n||n||n||0|
|n||n||n||n||n|

Где n - переменная, но другие нули - это константы, n также не может быть нулем.

Мне нужно получить такой результат, как я hardcoded с использованием альтернативного оператора https://regex101.com/r/vE9hL4/1

Мне нужно захватить все числа внутри '| |" как в моем регулярном выражении. Пожалуйста, помогите упростить его.

  • 1
    Боюсь, я потерян. Почему бы не взорваться на обрезать | и взорваться на || получить массив на строку? Что вы пытаетесь выбраться из этого? Один массив со всеми 5 строками, или массив в строке, или только результаты в виде строки, или?
  • 0
    Я тоже потерян. В чем разница между | 1 || 0 | и | 0 || 0 |?
Показать ещё 4 комментария
Теги:
preg-match
regex-lookarounds
regex-greedy

2 ответа

2

Во-первых, я бы сделал сопоставление; одно или несколько положительных чисел, заключенных в символы трубопровода, необязательно сопровождаемые нулями, заключенными в символы трубопровода.

$subject = '|12||13||56||1||0|';
$re = '/^((?:\|[1-9]\d*\|)+)(?:\|0\|)*$/';

Если он совпадает, вы можете сделать разбивку на основе самих символов трубы:

if (preg_match_all($re, $subject, $matches)) {
    $numbers = preg_split('/\|/', $matches[1][0], -1, PREG_SPLIT_NO_EMPTY);
}
  • 0
    Отличный код +1 ... Можете ли вы объяснить свой ответ? Я хотел бы видеть, как разрушается регулярное выражение.
1

извините, не прочитал часть вопроса, вот мой пересмотренный ответ...

^\|([0-9]*)\|(?:\|(0)\|\|(0)\|\|(0)\|\|(0)\||(?:\|([1-9]*)\|\|(0)\|\|(0)\|\|(0)\|)|(?:\|([1-9]*)\|\|([1-9]*)\|\|(0)\|\|(0)\|)|(?:\|([1-9]*)\|\|([1-9]*)\|\|([1-9]*)\|\|(0)\|)|(?:\|([1-9]*)\|\|([1-9]*)\|\|([1-9]*)\|\|([1-9]*)\|)|)$

https://regex101.com/r/mW5bN4/1

Ещё вопросы

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