Ruby正则表达式避免匹配组

时间:2018-08-14 23:14:48

标签: ruby regex regex-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或regex中是否有只抓住第一部分的方法?

1 个答案:

答案 0 :(得分:2)

您应该在此处使用单个分组结构,该结构可以匹配1个或多个出现的四个十六进制字符,并省略内部捕获组,从而在结果数组中产生额外的项:

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

请注意,+是写{1,}(一种或多种情况)的一种更简单,更短的方法。

详细信息

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