[英]How to match string with complex delimiters (regex in ruby)
我想從類似的字符串匹配屬性對以下
<tag_name attra="#{t("a.b.c")}" attrb="aa a">
...充滿靈魂的比賽
attra =“#{t(” abc“)}”和attrb =“ aa a”
在此先感謝Marius
通過查看引號后面是否有空格或'>',您可以使用前瞻性來檢測引號是否是值的一部分
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\""]
當然,如果屬性值中帶有引號后跟空格或“>”,那是行不通的,因此,無論您如何看待它,都是一場失敗的戰斗,除非您跳過屬性值內的那些引號或對其進行預處理不知何故。 這就是為什么如果每種語言的字符串和正則表達式都在定界值中找到,則會跳過或對其進行預處理的原因。
如果屬性值中沒有引號(例如attrb="aa a"
),或者如果引號是作為實體轉義的(例如attrib=""Hello," he said"
),那么將很容易按照以下方式使用正則表達式
/\w+="[^"]*"/
但是,由於您實際上是在嘗試匹配attra="#{t("abc")}"
,這是一些生成XML(並且本身不是有效的XML)的Ruby代碼的一部分,甚至是XML解析器(例如REXML或Nokogiri)無法為您解決此問題。 你需要自己的上下文無關的解析器,或者你需要用戶松土庫,該庫的1.9.1標准庫來解析插值Ruby代碼屬性的部件的一部分,然后用一些巧妙的黑客(例如將插入的紅寶石代碼替換為特殊字符串)以匹配屬性值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.