我不太清楚我是否理解非捕获组的工作原理.我正在寻找一个正则表达式来产生这个结果:5.214.我认为下面的正则表达式可行,但它正在取代包括非捕获组在内的所有内容.如何编写正则表达式才能替换捕获组?
"5,214".gsub(/(?:\d)(,)(?:\d)/, '.')
# => ".14"
Run Code Online (Sandbox Code Playgroud)
我想要的结果:
"5,214".gsub(some_regex)
#=> "5.214
Run Code Online (Sandbox Code Playgroud)
saw*_*awa 22
你不能.gsub取代整场比赛; 它对捕获的组没有任何作用.无论是否捕获这些组,都没有任何区别.
为了达到结果,您需要使用lookbehind和lookahead.
"5,214".gsub(/(?<=\d),(?=\d)/, '.')
Run Code Online (Sandbox Code Playgroud)
alp*_*avo 15
非捕获组仍然消耗匹配
使用
"5,214".gsub(/(\d+)(,)(\d+)/, '\1.\3')
或
"5,214".gsub(/(?<=\d+)(,)(?=\d+)/, '.')
\K 替换正则表达式引擎生成的整个匹配项.
RTFM,捕获/非捕获组构造都不会保留.但是,您可以使用不会"消耗"字符串上任何字符的外观断言.
"5,214".gsub(/\d\K,(?=\d)/, '.')
Run Code Online (Sandbox Code Playgroud)
说明:该\K转义序列重置报道比赛的出发点和任何先前消耗字符不再列入.话虽如此,我们然后寻找并匹配逗号,而正向前瞻断言,数字跟随.
也可以使用Regexp.last_match(也可以通过$~)块版本访问完整版本MatchData:
"5,214".gsub(/(\d),(\d)/) { |_|
match = Regexp.last_match
"#{match[1]}.#{match[2]}"
}
Run Code Online (Sandbox Code Playgroud)
这样可以更好地扩展到涉及更多的用例。
Nota bene,来自Ruby文档:
:: last_match对于执行模式匹配的方法的线程和方法范围是局部的。
| 归档时间: |
|
| 查看次数: |
16207 次 |
| 最近记录: |