我让这段代码在缓冲区内运行(用于在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中是否有只抓住第一部分的方法?
答案 0 :(得分:2)
您应该在此处使用单个分组结构,该结构可以匹配1个或多个出现的四个十六进制字符,并省略内部捕获组,从而在结果数组中产生额外的项:
.scan(/^(?:\\u[\da-fA-F]{4})+/)
请注意,+
是写{1,}
(一种或多种情况)的一种更简单,更短的方法。
详细信息
^
-字符串的开头(?:
-非捕获组的开始(匹配的组不会添加到最终的scan
结果中):
\\u
-一个\u
子字符串[\da-fA-F]{4}
-四个十六进制字符)+
-1次或多次(组模式序列)。