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 次或多次(组模式序列)。
我在缓冲区中有这段代码 运行(用于对 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 次或多次(组模式序列)。