簡體   English   中英

Ruby Regex匹配某些字符前后的字符串

[英]Ruby Regex matching string before and after certain characters

我有這樣的字符串:

<block trace="true" name="AssignResources: Append Resources">

我需要在<之后加上單詞(或下一個空格中的字符) < (在這種情況下為block )和=之前的單詞(此處為tracename )。

我嘗試了幾種正則表達式模式,但是所有嘗試均返回包含“定界符”字符的單詞,例如;block

我確定這並不難,但是我還沒有找到解決方案。

有人暗示嗎?
謝謝。

順便說一句:我想用gsub替換模式匹配。

編輯:

使用以下正則表達式解決了它:

1)/ /\\s(\\w+)="(.*?)"/ )="(. /\\s(\\w+)="(.*?)"/ )" /\\s(\\w+)="(.*?)"/匹配所有attr及其在$ 1和$ 2中的值。

2)/& /<!--.*-->/匹配注釋

3) /&lt;([\\/|!|\\?]?)([A-Za-z0-9]+)[^\\s|&gt;|\\/]*/匹配所有標簽名稱,放在結束標記,自結束標記, <?xml> -tag或DTD-tag中。 $1包括可選的前綴/ ! or ? / ! or ? 或什么也沒有,並且$2包含標記名

你可以試試:

&lt;([^ ]*)\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
'&lt;block trace="true" name="AssignResources: Append Resources"&gt;'[/&lt;(\w+)/, 1]
#=> "block"

如果將正則表達式和索引i傳遞給String#[] ,它將返回第i個捕獲組的值。

編輯:

在1.9中,您可以使用/(?<=&lt;)\\w+/來要求&lt; 沒有匹配。 在1.8中,沒有辦法做到這一點。 最好的辦法是將不想替換的零件放在捕獲組中,然后按如下方式訪問替換組:

"lo&lt;la li".gsub(/(&lt;)(\w+)/, '\1 --\2--')
 #=> "lo&lt; --la-- li"
&lt;block trace="true" name="AssignResources: Append Resources"&gt;

&lt;([^\s]+)\s+([^=]+)="([^"]*)"\s+([^=]+)="([^"]*)"\s*&gt;

#result:

$1 block
$2 trace
$3 true
$4 name
$5 AssignResources: Append Resources

更新:我不知道紅寶石,但是根據這里gsub的描述,我相信類似以下的方法可以解決問題。

str = '&lt;block trace="true" name="AssignResources: Append Resources"&gt;'
repl = str.gsub(/&lt;([^\s]+)\s+([^=]+)="([^"]*)"\s+([^=]+)="([^"]*)"\s*&gt;/, 
    "tag name: \\1\n\\2 is \\3 and \\4 is \\5\n")
print repl

很可能您應該選擇Nokigiri或類似的東西。 我不能將它放在一個gsub中,而只能放在兩個中:

>> m,r=0,["&lt;blockie ", " tracie=", " namie="]
>> s.gsub(/&lt;.*?([^\s]+)\s/, r[0]).gsub(/\s([^=]+)=/) {|ma| m+=1; r[m]}
=> "&lt;blockie tracie="true" namie="AssignResources: Append Resources"&gt;"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM