Разделение строки в соответствии с разделителем, когда элементы в строке могут содержать разделитель - PullRequest
2 голосов
/ 17 марта 2010

У меня есть строка, которая выглядит следующим образом:

"#Text() #SomeMoreText() #TextThatContainsDelimiter(#blah) #SomethingElse()"

Я хотел бы получить обратно

[#Text(), #SomeMoreText(), #TextThatContainsDelimiter(#blah), #SomethingElse()]

ОдинЯ подумал, что нужно сделать так, чтобы # был экранирован в \#, что делает входную строку:

"#Text() #SomeMoreText() #TextThatContainsDelimiter(\#blah) #SomethingElse()"

Затем я могу разделить его, используя /[^\\]#/, что дает мне:

[#Text(), SomeMoreText, TextThatContainsDelimiter(\#blah), SomethingElse()]

Первый элемент будет содержать #, но я могу его убрать.Однако есть ли более чистый способ сделать это, не выходя из #, и который гарантирует, что первый элемент не будет содержать #?По сути, я бы хотел, чтобы оно делилось на #, только если # не заключено в круглые скобки.

Я догадываюсь, что, поскольку # является контекстно-зависимым, а регулярные выражения подходят толькодля строк без контекста это может быть неправильный инструмент.Если да, должен ли я написать для этого грамматику и развернуть свой собственный анализатор / лексер?

Ответы [ 2 ]

2 голосов
/ 18 марта 2010

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

/\s+(?=#)/

Это оставляет ведущий # на всех токенах, но вам не нужно специально обрабатывать первый токен. Вы также можете использовать это:

/(?:^|\s+)#/

Это лишит хеш-символы за счет генерации пустой строки в качестве первого токена. Но некоторые языки предоставляют способ отбрасывать пустые ведущие токены. Обратите внимание, что JavaScript поддерживает предпросмотры, но не предвидение.

2 голосов
/ 17 марта 2010

Argh! Я склонен терять свои способности здесь. Регулярное выражение (?<!\()(?=#) работает

PS Home:\> $s -split '(?<!\()(?=#)'

#Text()
#SomeMoreText()
#TextThatContainsDelimiter(#blah)
#SomethingElse()

Это объединяет отрицательный взгляд за (чтобы убедиться, что перед # нет открывающей скобки) и положительный взгляд для поиска #.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...