【问题标题】:Ruby regex: split string with match beginning with either a newline or the start of the string?Ruby正则表达式:拆分字符串,匹配以换行符或字符串开头?
【发布时间】:2011-12-10 10:59:53
【问题描述】:

这是我的正则表达式。我在使用 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:我再次更新了这两个。 (中部标准时间 16:32)

【问题讨论】:

  • 你的字符串是这样的吗?还是实际的 \n 是不同的行?
  • 换行符确实在字符串中。

标签: ruby regex string pattern-matching


【解决方案1】:

为什么不在换行符处拆分?从您的示例来看,这就是您真正想要做的事情。

str.split("\n")

【讨论】:

    【解决方案2】:

    下面正则表达式的第 1 组和第 2 组:

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

    会给你你想要的输出。我不是红宝石专家,所以你必须自己创建列表:)

    【讨论】:

    • 我只有在删除 \n 上的转义后才能让这个正则表达式工作。我选择了@Paul Rubel 的解决方案,因为它不太容易混淆。
    • @BenjaminKreeger 没关系。正如我所说,我不知道红宝石:)
    【解决方案3】:

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

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

    【讨论】:

    • 我得说,这个效果最好。数组的开头有一个空行,但你也考虑到了这一点(我有一个 Array 扩展方法,可以删除任何空白或 nil 条目,这是我将使用的)。谢谢,保罗。
    猜你喜欢
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 2015-02-26
    • 2016-12-07
    相关资源
    最近更新 更多