[英]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.