我有一个这样的字符串:
<block trace="true" name="AssignResources: Append Resources">
我需要在<
(在本例中为 block )和=
之前的单词(此处)之后得到单词(或字符到下一个空格)
跟踪和名称)。
我尝试了几种正则表达式模式,但我的所有尝试都返回了包含“分隔符”字符的单词...就像;block
一样。
我确定这并不难,但我还没有找到解决方案。
有人有提示吗? 感谢。
顺便说一句:我想用gsub
替换模式匹配。
编辑:
使用以下正则表达式解决它:
1)
/\s(\w+)="(.*?)"/
匹配所有attr及其在$ 1和$ 2中的值。
2)
/<!--.*-->/
匹配评论
3)
/<([\/|!|\?]?)([A-Za-z0-9]+)[^\s|>|\/]*/
匹配所有标记名称,它们位于结束标记,自闭标记,<?xml>
- 标记或DTD标记。 $1
包含可选的前缀/ ! or ?
或任何内容,$2
包含标记名
答案 0 :(得分:1)
您可以尝试:
<([^ ]*)\s([^=]*)=
答案 1 :(得分:1)
它看起来非常像parsing HTML with regex给我
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
答案 2 :(得分:0)
'<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"
答案 3 :(得分:0)
<block trace="true" name="AssignResources: Append Resources">
<([^\s]+)\s+([^=]+)="([^"]*)"\s+([^=]+)="([^"]*)"\s*>
#result:
$1 block
$2 trace
$3 true
$4 name
$5 AssignResources: Append Resources
更新:我不知道ruby,但根据gsub here的描述,我相信以下内容应该可以解决问题。
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
答案 4 :(得分:0)
很可能你应该和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">"