Ruby Regex在某些字符之前和之后匹配字符串

时间:2010-02-24 14:38:31

标签: ruby regex

我有一个这样的字符串:

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

我需要在<(在本例中为 block )和=之前的单词(此处)之后得到单词(或字符到下一个空格) 跟踪名称)。

我尝试了几种正则表达式模式,但我的所有尝试都返回了包含“分隔符”字符的单词...就像;block一样。

我确定这并不难,但我还没有找到解决方案。

有人有提示吗? 感谢。

顺便说一句:我想用gsub替换模式匹配。

编辑:

使用以下正则表达式解决它:

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

2)     /<!--.*-->/ 匹配评论

3)     /&lt;([\/|!|\?]?)([A-Za-z0-9]+)[^\s|&gt;|\/]*/ 匹配所有标记名称,它们位于结束标记,自闭标记,<?xml> - 标记或DTD标记。 $1包含可选的前缀/ ! or ?或任何内容,$2包含标记名

5 个答案:

答案 0 :(得分:1)

您可以尝试:

&lt;([^ ]*)\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)

'&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"

答案 3 :(得分:0)

&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

更新:我不知道ruby,但根据gsub here的描述,我相信以下内容应该可以解决问题。

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

答案 4 :(得分:0)

很可能你应该和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;"