Ruby正则表达式:拆分字符串,匹配以换行符或字符串的开头开头?

时间:2011-10-18 21:11:59

标签: ruby regex string pattern-matching

这是我的正则表达式。我在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"]

编辑#1 :我已更新了我的正则表达式和结果。 (2011/10/18 16:26 CST)
编辑#2 :我再次更新了。 (CST 16:32)

3 个答案:

答案 0 :(得分:2)

如果您只是在每个字符串的前面添加'\ 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"]

我们必须注意最初的额外比赛,但这并不算太糟糕。我怀疑有人可以缩短这一点。

答案 1 :(得分:0)

第1组&以下正则表达式中的2个:

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

将为您提供所需的输出。我不是红宝石专家所以你必须自己创建列表:)

答案 2 :(得分:0)

为什么不分开换行?从你的例子来看,它看起来就像你真正想做的那样。

str.split("\n")