使用正则表达式时,ruby 语法高亮无法正常工作。
- 这是 ruby 语法高亮问题:
看起来这里发生了多个问题。
- 它似乎将正则表达式中的字符串插值解释为注释(
#
),并从该点开始弄乱了该行的整个语法突出显示。 - 看起来行中的
"
和的组合从该点开始一直到文件末尾都乱了。这要严重得多。'
string_literal
- 以下是代码示例:
class Tokenizer
def initialize(expression)
@expression = expression
end
TOKEN_REGEX = /
(?<whitespace>\s+) |
(?<parenthesis>[\(\)]) |
(?<comparison_operator>#{ComparisonNode::OPERATORS.map { |op| Regexp.escape(op) }.join('|')}) |
(?<logical_operator>\b(?:#{LogicalNode::OPERATORS.join('|')})\b) |
(?<boolean_literal>\b(?:#{ValueNode::BOOLEAN_LITERALS.join('|')})\b) |
(?<number_literal>\d+) |
(?<string_literal>"[^"]*"|'[^']*') |
(?<identifier>[a-z_][a-z0-9_\.]*) |
(?<unknown>.)
/ix.freeze
def tokenize
tokens = []
@expression.scan(TOKEN_REGEX) do
match_data = Regexp.last_match
if match_data[:whitespace]
next
elsif match_data[:parenthesis]
tokens << Token.new(:parenthesis, match_data[0])
elsif match_data[:comparison_operator]
tokens << Token.new(ComparisonNode::TYPE, match_data[0])
elsif match_data[:logical_operator]
tokens << Token.new(LogicalNode::TYPE, match_data[0].upcase)
elsif match_data[:boolean_literal]
tokens << Token.new(:literal, match_data[0].downcase)
elsif match_data[:number_literal]
tokens << Token.new(:literal, match_data[0])
elsif match_data[:string_literal]
value = match_data[0][1...-1] # Remove surrounding quotes
tokens << Token.new(:literal, value)
elsif match_data[:identifier]
tokens << Token.new(FieldNode::TYPE, match_data[0])
else
raise "Unexpected character: #{match_data[0]}"
end
end
tokens
end
end
最初,这是 Sublime Text 3 (Version 3.2.2, Build 3211) 内置 ruby 语法高亮中发生的。我尝试安装 ruby 语法高亮特定软件包来修复此问题,例如Sublime Better Ruby,但没有成功。
有人遇到同样的问题吗?如果有,您是如何解决的?谢谢!
Sublime Text Ruby 语法持有一种固执的观点,即多行正则表达式通常使用
%r
文字语法。/ /
因此,仅当前面的斜杠和尾随的斜杠位于同一行时,使用才有效。如Ruby.sublime-syntax所示。我链接了 v3211,因为这是您指定的版本,但同样适用于 v4108 之前及之前的所有版本。看来这个问题在v4109中得到了修补
了解这一点后,您可以将代码更改为:
并且语法高亮显示如预期工作。
另外,Regexp::union提供了一种合并值的方法,
Array
因此您无需手动连接或转义。这意味着您只需使用: