Ruby regex: разбить строку с совпадением, начинающимся либо с новой строки, либо с начала строки? - PullRequest
2 голосов
/ 19 октября 2011

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

regex = /(?:\n^)(\*[\w+ ?]+\*)\n/

Вот моя цель: я хочу разбить строку с регулярным выражением *delimited by asterisks*, включая те,звездочки. Однако : я хочу разделить по совпадению только в том случае, если перед ним стоит символ новой строки (\n) или это начало всей строки.Это строка, с которой я работаю.

"*Friday*\nDo not *break here*\n*But break here*\nBut again, not this"

Мое регулярное выражение не разделяется должным образом при совпадении *Friday*, но равно разбиению при совпадении *But break here* (он также добавляет разбивку here).Моя проблема где-то в первой группе, я думаю: (?:\n^) - Я знаю, что это неправильно, и я не совсем уверен, как правильно написать это.Может кто-нибудь пролить свет?Вот мой полный код.

regex = /(?:\n^)(\*[\w+ ?]+\*)\n/
str = "*Friday*\nDo not *break here*\n*But break here*\nBut again, not this"
str.split(regex)

Что приводит к этому:

>>> ["*Friday*\nDo not *break here*", "*But break here*", "But again, not this"]

Я хочу, чтобы это было так:

>>> ["*Friday*", "Do not *break here*", "*But break here*", "But again, not this"]

Edit # 1: я обновил свое регулярное выражение и результат.(2011/10/18 16:26 CST)
Редактировать # 2 : Я снова обновил оба.(16:32 CST)

Ответы [ 3 ]

2 голосов
/ 19 октября 2011

Что, если вы просто добавите '\ n' в начало каждой строки.Это немного упрощает обработку:

regex = /(?:\n)(\*[\w+ ?]+\*)\n/
str = "*Friday*\nDo not *break here*\n*But break here*\nBut again, not this"

res = ("\n"+str).split(regex)
res.shift if res[0] == ""
res
=> [ "*Friday*", "Do not *break here*", 
     "*But break here*", "But again, not this"]

Мы должны следить за первым дополнительным матчем, но это не так уж плохоЯ подозреваю, что кто-то может немного сократить это.

0 голосов
/ 24 мая 2013

Почему бы просто не разделить на новые строки? Из вашего примера видно, что вы действительно пытаетесь это сделать.

str.split("\n")
0 голосов
/ 19 октября 2011

Группы 1 и 2 регулярного выражения ниже:

(?:\A|\\n)(\*.*?\*)|(?:\A|\\n)(.*?)(?=\\n|\Z)

Даст вам желаемый результат. Я не эксперт по рубинам, поэтому вам придется составить список самостоятельно:)

...