Ruby 正则表达式避免匹配组

Ruby regex avoid matching a group

我在缓冲区中有这段代码 运行(用于对 Ruby 中的 JS 字符串进行转义):

  elsif hex_substring =~ /^\u[0-9a-fA-F]{1,4}/
    hex_substring.scan(/^((\u[\da-fA-F]{4}){1,})/) do |match|
      hex_byte = match[0]
      buffer    << JSON.load(%Q("#{hex_byte}"))
      hex_index += hex_byte.length
    end
  ...

我担心 scan() 匹配得有点太多了:

hex_substring.scan(/^((\u[\da-fA-F]{4}){1,})/)
# => [["\ud83c\udfec", "\udfec"]]

我只使用 "\ud83c\udfec",没有使用 "\udfec"

有没有办法在 Ruby 或正则表达式中只抓取第一部分?

您应该在此处使用单个分组构造,即匹配 1 次或多次出现的四个十六进制字符的构造,并省略导致结果数组中出现额外项目的内部捕获组:

.scan(/^(?:\u[\da-fA-F]{4})+/)

请注意,+ 是一种更简单、更简短的写法 {1,}(出现一次或多次)。

详情

  • ^ - 字符串开头
  • (?: - 非捕获组的开始(它匹配的内容不会添加到最终的 scan 结果中):
    • \u - \u 子串
    • [\da-fA-F]{4} - 四个十六进制字符
  • )+ - 出现 1 次或多次(组模式序列)。