我正在使用ruby中的语法高亮显示器。从此输入字符串(每行处理):
"left"<div class="wer">"test"</div>"right"
var car = ['Toyota', 'Honda']
如何在第一行{@ 1}}和"left"
找到"right"
和'Toyota'
?
我有'Honda'
来突出显示引用的字符串。我正在努力应对正则表达式部分背后的负面看法。
我尝试添加另一个正则表达式(["'])(\\\1|[^\1]*?)\1
,但我无法使用带引号的字符串。它仅适用于简单的字母数字。
答案 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'"]
直播示例
我建议使用HTML解析引擎。这个对Ruby来说似乎相当不错:https://www.ruby-toolbox.com/categories/html_parsing