ruby' gsub'到蛇案

时间:2015-01-18 12:41:17

标签: ruby regex

一本书中的以下代码应该将"FOO92OBAR"转移到"FOO92_O_BAR"

gsub(/([a-z\d])([A-Z])/, '\1_\2')

任何人都可以解释一下这是如何运作的吗?

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)

使用regular expressions

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"]]

默认情况下,正则表达式区分大小写。