我不太确定我是否理解非捕获组是如何工作的。我正在寻找一个正则表达式来产生这个结果:5.214。我原以为下面的正则表达式可以工作,但它替换了所有内容,包括非捕获组。我如何编写一个只替换捕获组的正则表达式?
5.214
"5,214".gsub(/(?:\d)(,)(?:\d)/, '.') # => ".14"
我想要的结果:
"5,214".gsub(some_regex) #=> "5.214
qyyhg6bp1#
非捕获组仍使用匹配使用了"5,214".gsub(/(\d+)(,)(\d+)/, '\1.\3')或"5,214".gsub(/(?<=\d+)(,)(?=\d+)/, '.')
"5,214".gsub(/(\d+)(,)(\d+)/, '\1.\3')
"5,214".gsub(/(?<=\d+)(,)(?=\d+)/, '.')
xmjla07d2#
不能。gsub将替换整个匹配;它不对捕获的组执行任何操作。2捕获与否对组没有任何影响。为了获得结果,需要使用lookbehind和lookahead。
gsub
"5,214".gsub(/(?<=\d),(?=\d)/, '.')
dfty9e193#
也可以在块版本中使用Regexp.last_match(也可通过$~获得)来访问完整的MatchData:
Regexp.last_match
$~
MatchData
"5,214".gsub(/(\d),(\d)/) { |_| match = Regexp.last_match "#{match[1]}.#{match[2]}" }
这可以更好地扩展到更复杂的用例。贝内,来自Ruby文档:::last_match对于执行模式匹配的方法的线程和方法范围是本地的。
nhjlsmyf4#
gsub替换正则表达式引擎生成的整个匹配。捕获/非捕获组结构都不保留。但是,您可以使用不“消耗”字符串中任何字符的lookaroundAssert。
"5,214".gsub(/\d\K,(?=\d)/, '.')
说明:\K逸出序列会重设报告相符项目的起始点 *,而且不再包含任何先前使用的字符 *。也就是说,我们接着会寻找并比对逗号,而正向Lookahead会判断提示后面跟着数字。
\K
0g0grzrc5#
我对露比一无所知。但是从我在教程中看到的情况来看gsub表示替换,模式应该是/(?<=\d+),(?=\d+)/,只是用点替换逗号或,使用捕获/(\d+),(\d+)/将字符串替换为"\1.\2"?
/(?<=\d+),(?=\d+)/
/(\d+),(\d+)/
"\1.\2"
c9qzyr3d6#
您不需要regexp来实现您所需要的:'1,200.00'.tr('.','!').tr(',','.').tr('!', ',')
'1,200.00'.tr('.','!').tr(',','.').tr('!', ',')
1,200!00
1.200!00
1.200,00
nlejzf6q7#
您可以轻松地在替换字符串(第二个参数)中引用捕获组,如下所示:
"5,214".gsub(/(\d+)(,)(\d+)/, '\1.\3') #=> "5.214"
\0
\1
\2
您可以使用,字符的非捕获组重写上面的示例。
,
"5,214".gsub(/(\d+)(?:,)(\d+)/, '\1.\2') #=> "5.214"
正如您所看到的,逗号后面的部分现在是第二个捕获组,因为我们将中间的组定义为非捕获组。尽管在这种情况下这是没有意义的。
"5,214".gsub(/(\d+),(\d+)/, '\1.\2') #=> "5.214"
7条答案
按热度按时间qyyhg6bp1#
非捕获组仍使用匹配
使用了
"5,214".gsub(/(\d+)(,)(\d+)/, '\1.\3')
或
"5,214".gsub(/(?<=\d+)(,)(?=\d+)/, '.')
xmjla07d2#
不能。
gsub
将替换整个匹配;它不对捕获的组执行任何操作。2捕获与否对组没有任何影响。为了获得结果,需要使用lookbehind和lookahead。
dfty9e193#
也可以在块版本中使用
Regexp.last_match
(也可通过$~
获得)来访问完整的MatchData
:这可以更好地扩展到更复杂的用例。
贝内,来自Ruby文档:
::last_match对于执行模式匹配的方法的线程和方法范围是本地的。
nhjlsmyf4#
gsub替换正则表达式引擎生成的整个匹配。捕获/非捕获组结构都不保留。但是,您可以使用不“消耗”字符串中任何字符的lookaroundAssert。
说明:
\K
逸出序列会重设报告相符项目的起始点 *,而且不再包含任何先前使用的字符 *。也就是说,我们接着会寻找并比对逗号,而正向Lookahead会判断提示后面跟着数字。0g0grzrc5#
我对露比一无所知。
但是从我在教程中看到的情况来看
gsub表示替换,模式应该是
/(?<=\d+),(?=\d+)/
,只是用点替换逗号或,使用捕获/(\d+),(\d+)/
将字符串替换为"\1.\2"
?c9qzyr3d6#
您不需要regexp来实现您所需要的:
'1,200.00'.tr('.','!').tr(',','.').tr('!', ',')
1,200!00
)1.200!00
)1.200,00
)nlejzf6q7#
您可以轻松地在替换字符串(第二个参数)中引用捕获组,如下所示:
\0
将返回整个匹配字符串。\1
将被第一捕获组替换。\2
将被第二捕获组替换,等等。您可以使用
,
字符的非捕获组重写上面的示例。正如您所看到的,逗号后面的部分现在是第二个捕获组,因为我们将中间的组定义为非捕获组。
尽管在这种情况下这是没有意义的。