如何匹配字符串与复杂分隔符(ruby中的正则表达式)

时间:2010-08-17 12:36:40

标签: ruby regex

我想匹配类似于下面的字符串的属性对

<tag_name attra="#{t("a.b.c")}" attrb="aa a">

......可以匹配

ATTRA = “#{T(” A.B.C “)}” 和 attra =“a a”

提前谢谢 的Marius

2 个答案:

答案 0 :(得分:1)

您可以使用前瞻来检测结尾的引号是否是值的一部分,通过查看它们后面是空格还是'&gt;'

ruby-1.8.7-p248 > s='<tag_name attra="#{t("a.b.c")}" attrb="aa a">'
=> "<tag_name attra=\"\#{t(\"a.b.c\")}\" attrb=\"aa a\">" 
ruby-1.8.7-p248 > s.scan /\w+=".*?"(?=\s|>)/
=> ["attra=\"\#{t(\"a.b.c\")}\"", "attrb=\"aa a\""] 

当然,如果您的引号后跟空格或'&gt;',则无效在你的属性值中,所以无论你如何看待它都是一场失败的战斗,除非你跳过属性值中的那些引号或以某种方式预处理它们。这就是为什么每个语言的字符串和正则表达式都会在分隔值内找到分隔符时跳过或预处理的原因。

答案 1 :(得分:0)

如果属性值中没有引号(如attrb="aa a")或引号是否作为实体进行转义(如attrib="&quot;Hello,&quot; he said")那么使用正则表达式会非常容易

的行
/\w+="[^"]*"/

但是,因为你真的想要匹配attra="#{t("a.b.c")}",它是生成XML的一些Ruby代码的一部分(并且它本身不是有效的XML),所以即使是XML解析器(例如REXML或Nokogiri)也赢了为你解决这个问题。您需要自己的无上下文解析器,或者您需要使用 ripper 库,它是Ruby 1.9.1标准库的一部分,用于解析内插Ruby代码的属性部分,然后使用一些聪明的黑客(比如用特殊字符串替换插值的ruby代码)来匹配属性值。