什么< \ 1>在String#sub中意味着什么?

时间:2013-11-10 12:51:07

标签: ruby regex

我正在阅读this但我不明白。我有两个问题。

有什么区别([aeiou])[aeiou]

<\1>是什么意思?

"hello".sub(/([aeiou])/, '<\1>')             #=> "h<e>llo"

2 个答案:

答案 0 :(得分:4)

这里documented

  

如果替换是一个字符串,它将替换匹配的文本。它可能包含对格式为"\d" 的模式的捕获组的反向引用,其中d是一个组号,或"\k<n>",其中n是一个组名。如果它是双引号字符串,则两个反向引用都必须以额外的反斜杠开头。但是,在替换中,特殊匹配变量(例如&$)不会引用当前匹配。

Character Classes

  

字符类用方括号([,])分隔,并列出可能出现在匹配中该点的字符。 / [ab] /表示或b,而不是/ ab /表示a后跟b。

希望上面的定义明确了[aeiou]是什么。

Capturing

  

括号可用于捕获 。由n th 括号组括起的文本随后可以用n表示。在一个模式中使用反向引用\ n;在模式之外使用MatchData [n]。

希望上面的定义明确了([aeiou])是什么。

([aeiou]) - 字符类[..]中的任何字符(将首先从字符串"hello"中找到)是\1的值(第一个捕获组) )。在此示例中,\1的值为e,将由<e>替换(如您定义的<\1>)。这就是使用"h<e>llo"方法从字符串hello生成String#sub的方式。

答案 1 :(得分:4)

您发布的文档说

  

它可能包含对模式的捕获组的反向引用   形式为“\ d”,其中d是组号,或“\ k”,其中n是一个组   名。

因此\1匹配第一个()组中捕获的内容,即[aeiou]中的一个,然后在替换<\1>

中使用它