使用 Ruby 正则表达式时,Sublime Text 会扰乱 Ruby 语法突出显示

问题描述 投票:0回答:1

使用正则表达式时,Ruby 语法突出显示无法正常工作。

  • 这里是ruby语法高亮问题:

enter image description here

这里似乎发生了多个问题。

  1. 它似乎将正则表达式内的字符串插值解释为注释(
    #
    ),并弄乱了从该行的该点开始的整个语法突出显示。
  2. 看起来
    "
    行中
    '
    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(版本 3.2.2,Build 3211)的内置 ruby 语法高亮中。我尝试安装 ruby 语法突出显示尝试解决此问题的特定软件包,例如 Sublime Better Ruby,但没有成功。

有人有同样的问题吗?如果是这样,你是如何解决的? 谢谢!

regex ruby sublimetext3 syntax-highlighting
1个回答
0
投票

Sublime text Ruby 语法期望多行正则表达式使用

%r
语法。

仅当前导正斜杠和尾随正斜杠位于同一行时,使用

/ /
才能正确工作。

知道这一点,您可以将代码更改为:

TOKEN_REGEX = %r{
    (?<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

语法突出显示按预期工作

© www.soinside.com 2019 - 2024. All rights reserved.