【问题标题】:Regex puzzle for parsing structured posts用于解析结构化帖子的正则表达式难题
【发布时间】:2011-07-03 17:55:09
【问题描述】:

假设一个人发布了这条消息:

“#books 列夫·托尔斯泰的《战争与和平》——我喜欢这本书。”

我想把它解析成三个变量,像这样:

@title = "战争与和平"

@author = "列夫·托尔斯泰"

@Comment = "我喜欢这本书"

我确信这对于 Regex Ninja 来说是一个简单的难题。不幸的是,我只是一个卑微的村民,拖着真正的 Regex Ninjas 训练的血淋淋、汗流浃背的地板。

如果您可以在消息帖子中建议一个不需要太多结构的正则表达式,则可以加分。理想情况下,我想在没有结构(或至少结构/要求较少)的情况下获得相同的三个变量:@author 的“@title”-@comment。

谢谢!

【问题讨论】:

    标签: ruby-on-rails regex


    【解决方案1】:
    regex = /'(.+)'\s+by\s+(.+)\s+-\s+(.+)/
    "#books 'War and Peace' by Leo Tolstoy - I love this book.".scan(regex)
    
    =>
    
    [["War and Peace", "Leo Tolstoy", "I love this book."]]
    

    【讨论】:

    • 感谢@Violent Crayon 和 Dogbert 的出色建议。我选择了这个答案,因为它开箱即用。
    【解决方案2】:

    我不知道 ruby​​ 语法,但您提供的格式的正则表达式本身看起来像这样:

    #books\s'([^']+)'\s+by\s+([^-]+)-\s+(.*)

    但是要回答您关于不使其如此依赖格式的问题...理想情况下,您应该将其设置为 3 个单独的字段来填写。或者,如果它是消息帖子中的一般内容并且它正在寻找特定格式(有点像 bbcode),那么我会建议更像

    [书名='title'作者='author']评论[/book]

    这样解析起来会容易得多。

    【讨论】:

    • 我的猜测是,这个人正试图解析推特帖子,从他们的示例中存在标签来判断。
    • 正确;理想情况下,这将解析类似 Twitter 的帖子。
    【解决方案3】:

    (["'])(?<title>[^"']*)\1\s+by\s+(?<author>[\p{L}\s']+)\s*-\s*(?<comment>.*)$

    关于第二条评论:仅使用正则表达式是不可能实现的,因为查看definition of regex - Regular 表达式,您的句子可能是irregular

    【讨论】:

      【解决方案4】:

      另一个答案:

      你可以选择一个你知道不会经常出现的分隔符,然后用它来分割字符串。然后强制执行值将处于哪个顺序的标准/假设(您或多或少已经在做)。例如,你可以让人们发帖

      “战争与和平~列夫·托尔斯泰~我喜欢这本书”

      然后在~ 处分解/拆分并假设第一个元素是标题,第二个是作者,第三个是评论。

      【讨论】:

        【解决方案5】:
        /["'](.*?)["'] by (.*?)\s+-\s+(.*)/
        

        【讨论】:

          猜你喜欢
          • 2011-02-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-12
          • 1970-01-01
          • 2011-07-20
          • 2022-01-25
          • 2013-12-31
          相关资源
          最近更新 更多