2016-07-27 22 views
0

Ниже приведено PHP, но регулярное выражение также будет использоваться в javascript.Попытка извлечь повторяющийся шаблон из строки в php/javascript

Попытка извлечь повторяющиеся узоры из строки

строка может быть любой из следующих:

"something arbitrary" 
"D123" 
"D111|something" 
"D197|what.org|when.net" 
"D297|who.197d234.whatever|when.net|some other arbitrary string" 

настоящее время я использую следующее регулярное выражение: /^D([0-9]{3})(?:\|([^\|]+))*/

это правильно не соответствует первая строка, правильно соответствует второй и третьей. Проблема в том, что третий и четвертый соответствуют только Dxxx и последней строке. Мне нужна каждая строка между '|' для соответствия.

Я надеюсь использовать регулярное выражение, поскольку это делает его одним шагом. Я понимаю, что могу просто обнаружить ведущий Dxxx, а затем использовать взрыв или раскол, если это необходимо, чтобы сломать строки. Я только что застрял в желании одного шага соответствия регулярному выражению.

Это же регулярное выражение может быть использовано и в Python, поэтому просто требуется общее решение регулярных выражений.

ответ

0

Нет никакого способа иметь динамическое количество групп захвата в регулярном выражении, но если вы знаете какой-то верхний предел того, сколько частей у вас будет в одной строке, вы можете просто повторить шаблон, который много раз:

/^D([0-9]{3})(?:$|\|)(.*?)(?:$|\|)(.*?)(?:$|\|)(.*?)(?:$|\|)(.*?)(?:$|\|)/ 

Таким образом, после начального ^D([0-9]{3})(?:$|\|) вы просто повторить (.*?)(?:$|\|) столько раз, сколько вам нужно.

Если в строке меньше элементов, оставшиеся группы захвата будут соответствовать пустой строке.

См. regex tester.

0

Может быть, что-то вроде preg_match_all() (вариант PHP глобального соответствия)?

Тогда вы могли бы использовать:

^(?|D([0-9]{3})|^.+$|(?!^)\|([^|\n]*)(?=\||$)) 

Это будет соответствовать все в строке в разных матчах, например, взять строку:

D197|what.org|when.net 

Это вы затем дать три матча:

D197 
what.org 
when.net 

Запуск в прямом эфире: https://regex101.com/r/jL2oX6/4 (все в зеленом цвете ваши группа матчи Игнорируйте то, что в синем.).