[英]Ruby Regex matching string before and after certain characters
我有这样的字符串:
<block trace="true" name="AssignResources: Append Resources">
我需要在<
之后加上单词(或下一个空格中的字符) <
(在这种情况下为block )和=
之前的单词(此处为trace和name )。
我尝试了几种正则表达式模式,但是所有尝试均返回包含“定界符”字符的单词,例如;block
。
我确定这并不难,但是我还没有找到解决方案。
有人暗示吗?
谢谢。
顺便说一句:我想用gsub
替换模式匹配。
编辑:
使用以下正则表达式解决了它:
1)/ /\\s(\\w+)="(.*?)"/
)="(. /\\s(\\w+)="(.*?)"/
)" /\\s(\\w+)="(.*?)"/
匹配所有attr及其在$ 1和$ 2中的值。
2)/& /<!--.*-->/
匹配注释
3) /<([\\/|!|\\?]?)([A-Za-z0-9]+)[^\\s|>|\\/]*/
匹配所有标签名称,放在结束标记,自结束标记, <?xml>
-tag或DTD-tag中。 $1
包括可选的前缀/ ! or ?
/ ! or ?
或什么也没有,并且$2
包含标记名
你可以试试:
<([^ ]*)\s([^=]*)=
它看起来非常像用正则表达式解析HTML
Ruby有一个非常好的html解析器,叫做Nokogiri
这是如何做的
require 'nokogiri'
html=Nokogiri::HTML('<block trace="true" name="AssignResources: Append Resources">')
html.xpath("//*").each do |s|
puts s.node_name #block
puts s.keys #trace, name
puts s.values #true, AssignResources: Append Resources
end
'<block trace="true" name="AssignResources: Append Resources">'[/<(\w+)/, 1]
#=> "block"
如果将正则表达式和索引i传递给String#[]
,它将返回第i个捕获组的值。
编辑:
在1.9中,您可以使用/(?<=<)\\w+/
来要求<
没有匹配。 在1.8中,没有办法做到这一点。 最好的办法是将不想替换的零件放在捕获组中,然后按如下方式访问替换组:
"lo<la li".gsub(/(<)(\w+)/, '\1 --\2--')
#=> "lo< --la-- li"
<block trace="true" name="AssignResources: Append Resources">
<([^\s]+)\s+([^=]+)="([^"]*)"\s+([^=]+)="([^"]*)"\s*>
#result:
$1 block
$2 trace
$3 true
$4 name
$5 AssignResources: Append Resources
更新:我不知道红宝石,但是根据这里对gsub的描述,我相信类似以下的方法可以解决问题。
str = '<block trace="true" name="AssignResources: Append Resources">'
repl = str.gsub(/<([^\s]+)\s+([^=]+)="([^"]*)"\s+([^=]+)="([^"]*)"\s*>/,
"tag name: \\1\n\\2 is \\3 and \\4 is \\5\n")
print repl
很可能您应该选择Nokigiri或类似的东西。 我不能将它放在一个gsub中,而只能放在两个中:
>> m,r=0,["<blockie ", " tracie=", " namie="]
>> s.gsub(/<.*?([^\s]+)\s/, r[0]).gsub(/\s([^=]+)=/) {|ma| m+=1; r[m]}
=> "<blockie tracie="true" namie="AssignResources: Append Resources">"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.