一本书中的以下代码应该将"FOO92OBAR"
转移到"FOO92_O_BAR"
:
gsub(/([a-z\d])([A-Z])/, '\1_\2')
任何人都可以解释一下这是如何运作的吗?
答案 0 :(得分:1)
([a-z\d])
查找小写字母(a-z)或数字(\d
表示数字)。围绕整个事物的()将结果分配给正则表达式子组1。
([A-Z])
然后查找一个大写字母,将结果分配给组2.所以整个事情寻找一个小写或数字后跟一个大写字母。第二部分'\1_\2'
表示“正则表达式组1后跟正则表达式组2”
gsub每次看到一个小写或数字后跟一个大写字母替换(第一件事)_(第二件事)。
实际上FOO92OBAR
实际上是FOO92_OBAR
。
要使FOO92OBAR
成为FOO92_O_BAR
,替换部分应为'\1_\2_'
(因为只有O
是第二部分。BAR
不匹配,所以根本没有替换。)
答案 1 :(得分:1)
gsub的两个参数是匹配表达式和替换。由于匹配/([a-z\d])([A-Z])/
包含组(由(...)
标识),因此您可以使用\ID
在替换中引用匹配,其中ID是组的编号,从1开始。< / p>
那就是代码gsub(/([a-z\d])([A-Z])/, '\1_\2')
# take any combination of
([a-z\d])([A-Z])
# which means any combinations of a (1) lower-case char or (2) digit
([a-z\d])
# followed by an (1) upper case letter
([A-Z])
# if any, replace it with
\1_\2
# that represents the first group
\1
# followed by _
# followed by the second group
\2
请注意,您的示例将生成FOO92_OBAR
,而非FOO92_O_BAR
2.1.5 :001 > string = "FOO92OBAR"
=> "FOO92OBAR"
2.1.5 :002 > string.gsub(/([a-z\d])([A-Z])/, '\1_\2')
=> "FOO92_OBAR"
解释是因为只有一种情况是“小写字母或数字”(这是一个数字),后跟一个大写字母。
2.1.5 :003 > string.scan(/([a-z\d])([A-Z])/)
=> [["2", "O"]]
默认情况下,正则表达式区分大小写。