假设有人发布此消息:
Leo Tolstoy的“#books'War and Peace' - 我喜欢这本书。”
我想将其解析为三个变量,如:
@title =“战争与和平”
@author =“Leo Tolstoy”
@Comment =“我喜欢这本书”
我确信这对于正则表达式忍者而言是一个简单的谜题。不幸的是,我只是一个卑微的村民,拖着血腥,汗湿的地板上真正的Regex Ninjas火车。
BONUS指出,如果您可以建议在消息帖中不需要这么多结构的正则表达式。理想情况下,我想获得没有结构的相同三个变量(或者至少具有较少的结构/要求):@ author - @comment的“@title”。
谢谢!
答案 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+(.*)/