在 ruby 中,这个正则表达式有什么作用? /((\w)\2*)/
In ruby, what does this regex do? /((\w)\2*)/
"aaabbcde".scan(/((\w)*)/)
这行代码会得到如下结果
[["aaa", "a"], ["bb", "b"], ["c", "c"], ["d", "d"], ["e", "e"]]
我不明白的部分是*
的作用。为什么这会生成一个二维数组?
已编辑:
只是在获得帮助和进行一些研究后根据我的理解得出的总结。希望这会帮助任何搜索类似主题的人。
您可以使用正则表达式创建捕获组。后一组可以参考前一组。
每个括号都是一个捕获组。因此,如果您这样做 /(\w)/
,您将创建 1 个组,它会提取所有单词字符,并将每个单个字符放入一个单独的组中。
所以你会得到这样的字符串 "rubyy"
Match 1
1. r
Match 2
1. u
Match 3
1. b
Match 4
1. y
Match 5
1. y
要创建第二个捕获组,您只需添加另一对括号,例如 /((\w))/
。但是注意,外面一对括号是第一组,里面一对是第二组。这可以来来回回。
给定相同的字符串 "rubyy"
,这将有这样的结果。
Match 1
1. r
2. r
Match 2
1. u
2. u
Match 3
1. b
2. b
Match 4
1. y
2. y
Match 5
1. y
2. y
您可以尝试将正则表达式更改为 /(()\w)/
,或 /(\w)()/
,看看会发生什么(还记得我刚刚说过内括号对是第二组吗?)。 http://www.rubular.com 是在 ruby.
中试验正则表达式的好地方
指向另一个捕获组的指针:
所以我最初问的正则表达式,/((\w)*)/
,
这部分只是意味着“给我你从第 2 组得到的东西(里面的那个是第 2 组),然后把它放在第 1 组中(外面的那个,
在哪里)。然后 *
只是一个常规的正则表达式,表示零个或多个。在这种情况下,#2 提取的组中的零个或多个。
有了上面的理解,你可以尝试这样做/(\w)(*)/
。这也会达到类似的效果。但是您应该尝试一下差异。请记住,/(*)(\w)/
不起作用,因为我猜 ruby 在这种类型的并行结构中按顺序运行,所以
指向一个尚不存在的捕获组。
您有两个捕获组,第一个 ((\w)*)
,是从左到右解析时遇到的第一个,第二个是 (\w)
。 *
匹配捕获组 #2 的结果,零次或多次。
对于"aaa"
,内部捕获组(#2)匹配第一个"a"
,然后*
变成a*
,匹配接下来的两个[=17] =]的。因此,第一个捕获组匹配 'aaa'
.
请注意,捕获组 #2 始终只匹配一个字符。
考虑以下因素
//
中的任何内容都是要匹配的正则表达式模式
</code> 是一个变量(称为反向引用),指向第二组括号中匹配的任何内容,在本例中为 <code>\w
。如果它在另一个括号中匹配,你会使用 </code>;这些未转义的括号称为捕获组</li>
<li><code>*
是 0 个或多个匹配项
要获得更好的解释,请参阅有关正则表达式的大量指南。例如:http://www.regular-expressions.info/refcapture.html
"aaabbcde".scan(/((\w)*)/)
这行代码会得到如下结果
[["aaa", "a"], ["bb", "b"], ["c", "c"], ["d", "d"], ["e", "e"]]
我不明白的部分是*
的作用。为什么这会生成一个二维数组?
已编辑:
只是在获得帮助和进行一些研究后根据我的理解得出的总结。希望这会帮助任何搜索类似主题的人。
您可以使用正则表达式创建捕获组。后一组可以参考前一组。
每个括号都是一个捕获组。因此,如果您这样做 /(\w)/
,您将创建 1 个组,它会提取所有单词字符,并将每个单个字符放入一个单独的组中。
所以你会得到这样的字符串 "rubyy"
Match 1
1. r
Match 2
1. u
Match 3
1. b
Match 4
1. y
Match 5
1. y
要创建第二个捕获组,您只需添加另一对括号,例如 /((\w))/
。但是注意,外面一对括号是第一组,里面一对是第二组。这可以来来回回。
给定相同的字符串 "rubyy"
,这将有这样的结果。
Match 1
1. r
2. r
Match 2
1. u
2. u
Match 3
1. b
2. b
Match 4
1. y
2. y
Match 5
1. y
2. y
您可以尝试将正则表达式更改为 /(()\w)/
,或 /(\w)()/
,看看会发生什么(还记得我刚刚说过内括号对是第二组吗?)。 http://www.rubular.com 是在 ruby.
指向另一个捕获组的指针:
所以我最初问的正则表达式,/((\w)*)/
, 这部分只是意味着“给我你从第 2 组得到的东西(里面的那个是第 2 组),然后把它放在第 1 组中(外面的那个,
在哪里)。然后
*
只是一个常规的正则表达式,表示零个或多个。在这种情况下,#2 提取的组中的零个或多个。
有了上面的理解,你可以尝试这样做/(\w)(*)/
。这也会达到类似的效果。但是您应该尝试一下差异。请记住,/(*)(\w)/
不起作用,因为我猜 ruby 在这种类型的并行结构中按顺序运行,所以 指向一个尚不存在的捕获组。
您有两个捕获组,第一个 ((\w)*)
,是从左到右解析时遇到的第一个,第二个是 (\w)
。 *
匹配捕获组 #2 的结果,零次或多次。
对于"aaa"
,内部捕获组(#2)匹配第一个"a"
,然后*
变成a*
,匹配接下来的两个[=17] =]的。因此,第一个捕获组匹配 'aaa'
.
请注意,捕获组 #2 始终只匹配一个字符。
考虑以下因素
//
中的任何内容都是要匹配的正则表达式模式</code> 是一个变量(称为反向引用),指向第二组括号中匹配的任何内容,在本例中为 <code>\w
。如果它在另一个括号中匹配,你会使用</code>;这些未转义的括号称为捕获组</li> <li><code>*
是 0 个或多个匹配项
要获得更好的解释,请参阅有关正则表达式的大量指南。例如:http://www.regular-expressions.info/refcapture.html