如何使用复杂分隔符匹配字符串(ruby中的正则表达式)
我想将字符串相似的属性对匹配到下面的一个如何使用复杂分隔符匹配字符串(ruby中的正则表达式),ruby,regex,Ruby,Regex,我想将字符串相似的属性对匹配到下面的一个 <tag_name attra="#{t("a.b.c")}" attrb="aa a"> 。。。应该匹配 attra=“#{t(“a.b.c”)}” 和 attrb=“aa a” 提前谢谢 Marius如果属性值中没有引号(如attrb=“aa a”),或者如果引号作为实体转义(如attrib=”“Hello,”他说“),那么使用正则表达式就很容易了 /\w+="[^"]*"/ 但是,由于您确实在尝试匹配attra=“#{t(“a.
<tag_name attra="#{t("a.b.c")}" attrb="aa a">
。。。应该匹配
attra=“#{t(“a.b.c”)}”
和
attrb=“aa a”
提前谢谢
Marius如果属性值中没有引号(如
attrb=“aa a”
),或者如果引号作为实体转义(如attrib=”“Hello,”他说“
),那么使用正则表达式就很容易了
/\w+="[^"]*"/
但是,由于您确实在尝试匹配
attra=“#{t(“a.b.c”)}”
,这是生成XML的某些Ruby代码的一部分(并且本身不是有效的XML),因此即使是XML解析器(如REXML或Nokogiri)也无法为您解决此问题。您需要自己的上下文无关解析器,或者需要使用Ruby 1.9.1标准库的ripper库来解析属性中插入Ruby代码的部分,然后使用一些巧妙的技巧(比如用特殊字符串替换插入的Ruby代码)在属性值周围进行匹配。您可以使用lookaheads来检测结束的引号是否是该值的一部分,方法是查看引号后面是否有空格或“>”
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\""]
ruby-1.8.7-p248>s=''
=> ""
ruby-1.8.7-p248>s.scan/\w+=“*?”(?=\s |>)/
=>[“attra=\”{t(\'a.b.c\')}\,“attrb=\'aa a\\”]
当然,如果在属性值中有一个引号后跟空格或“>”,那么这将不起作用,因此无论您如何看待它,这都是一场失败的战斗,除非您跳过属性值中的引号或以某种方式对其进行预处理。这就是为什么每种语言的字符串和正则表达式都会跳过或预处理分隔符(如果它们位于分隔值内)。您想做什么?Ruby有一个带有REXML(以及更多)的XML解析器,它可能更适合您的任务。@Jens:REXML将被他给出的第一个属性阻塞。这是html解析,它可能不是有效的XML东西