Как разделить строку на ',' если ',' в скобках с помощью Regex? - PullRequest
11 голосов
/ 09 апреля 2009

РЕДАКТИРОВАТЬ: Может кто-нибудь помочь мне с регулярным выражением для строки, такой как это:

[Header 1], [Head,er 2], Header 3

так что я могу разбить это на куски как:

[Header 1]
[Head,er 2]
Header 3

Я дошел до этого:

(?<=,|^).*?(?=,|$)

Что даст мне:

[Header 1]
[Head
,er 2]
Header 3

Ответы [ 6 ]

16 голосов
/ 09 апреля 2009

В этом случае проще разделить на разделители (запятые), чем сопоставлять токены (или чанки). Идентификация запятых, которые являются разделителями, требует относительно простого взгляда:

,(?=[^\]]*(?:\[|$))

Каждый раз, когда вы находите запятую, вы заглядываете в одну из трех вещей. Если вы сначала найдете закрывающую квадратную скобку, запятая находится внутри пары скобок, так что это не разделитель. Если вы найдете открывающую скобку или конец строки / строки, это разделитель.

6 голосов
/ 09 апреля 2009
\[.*?\]

Забудьте о запятых, вы не заботитесь о них. :)

2 голосов
/ 09 апреля 2009
 (?<=,|^)\s*\[[^]]*\]\s*(?=,|$)

используйте разделители [ и ] в ваших интересах

2 голосов
/ 09 апреля 2009

Вариации этого вопроса обсуждались ранее.

Например:

Краткий ответ: Регулярные выражения, вероятно, не являются подходящим инструментом для этого. Напишите правильный парсер. Реализация FSM: easy .

1 голос
/ 09 апреля 2009

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

\[[^\]*]\]

Или вы используете это регулярное выражение для разбиения списка скобок (с использованием проверочных утверждений):

(?<=]|^)\s*,\s*(?=\[|$)
1 голос
/ 09 апреля 2009

Разве это не так просто?

(?<=,|^)(?:[^,]|\[[^[]*\])*
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...