如何选择html标签之外的带引号的字符串?

时间:2016-05-15 07:15:03

标签: ruby regex

我正在使用ruby中的语法高亮显示器。从此输入字符串(每行处理):

"left"<div class="wer">"test"</div>"right"
var car = ['Toyota', 'Honda']

如何在第一行{@ 1}}和"left"找到"right"'Toyota'

我有'Honda'来突出显示引用的字符串。我正在努力应对正则表达式部分背后的负面看法。

我尝试添加另一个正则表达式(["'])(\\\1|[^\1]*?)\1,但我无法使用带引号的字符串。它仅适用于简单的字母数字。

2 个答案:

答案 0 :(得分:0)

您可以使用正则表达式中的括号创建组,并使用|创建或条件来匹配一个或多个令牌:

/("left")|("right")|('Toyota')|('Honda')/

以下是一个例子:

http://rubular.com/r/C8ONnxKYEV

修改

刚刚看到您指定的问题图块要搜索HTML标记以外的内容。

不幸的是,仅使用正则表达式是不可能的。原因是HTML以及需要""''()等分隔符的任何语言都不常见。换句话说,正则表达式不包含区分嵌套级别的方法,因此您需要将解析器与正则表达式一起使用。如果您在Ruby中严格执行此操作,请考虑使用Nokogiri或Mechanize等工具来正确解析DOM并与DOM进行交互。

答案 1 :(得分:0)

描述

这个Ruby脚本首先找到并替换HTML标记,注意这并不完美,并且容易受到许多边缘情况的影响。然后脚本只查找所有单引号和双引号值。

str = %Q["left" <div class="wer">"test"</div>"right"\n]
str = str + %Q<var car = ['Toyota', 'Honda']>    
puts "SourceString: \n" + str + "\n\n"

str.gsub!(/(?:<([a-z]+)(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?>).*?<\/\1>/i, '_')
puts "SourceString after replacement: \n" + str + "\n\n"

puts "array of quoted values"
str.scan(/"[^"]*"|'[^']*'/)

示例输出

SourceString: 
"left" <div class="wer">"test"</div>"right"
var car = ['Toyota', 'Honda']

SourceString after replacement: 
"left" _"right"
var car = ['Toyota', 'Honda']

=> ["\"left\"", "\"right\"", "'Toyota'", "'Honda'"]

直播示例

https://repl.it/CRGo

HTML解析

我建议使用HTML解析引擎。这个对Ruby来说似乎相当不错:https://www.ruby-toolbox.com/categories/html_parsing