用于解析结构化帖子的正则表达式拼图

时间:2011-07-03 17:55:09

标签: ruby-on-rails regex

假设有人发布此消息:

  Leo Tolstoy的“#books'War and Peace' - 我喜欢这本书。”

我想将其解析为三个变量,如:

  

@title =“战争与和平”

     

@author =“Leo Tolstoy”

     

@Comment =“我喜欢这本书”

我确信这对于正则表达式忍者而言是一个简单的谜题。不幸的是,我只是一个卑微的村民,拖着血腥,汗湿的地板上真正的Regex Ninjas火车。

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

谢谢!

5 个答案:

答案 0 :(得分:0)

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."]]

答案 1 :(得分:0)

我不知道ruby语法,但你给出的格式的正则表达式本身看起来像这样:

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

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

[book title ='title'author ='author'] comment [/ book]

这将更容易解析。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

另一个答案:

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

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

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

答案 4 :(得分:-1)

/["'](.*?)["'] by (.*?)\s+-\s+(.*)/