3 回答
TA贡献1811条经验 获得超5个赞
最吸引人的是这fmt.Println(re.ReplaceAllString("-ab-axxb-", "$1W"))条线。该文件说:
在 repl 中,$符号被解释为Expand
并展开说:
在模板中,变量由形式$nameor的子字符串表示${name},其中 name 是由字母、数字和下划线组成的非空序列。 对超出范围或不匹配的索引或正则表达式中不存在的名称的引用将替换为空切片。
在$name形式中,name 尽可能长:$1x相当于${1x},not ${1}x,并且,$10相当于${10},not ${1}0。
因此,在第三次替换中,$1W被视为${1W}并且由于该组未初始化,因此使用空字符串进行替换。
当我说“组未初始化”时,我的意思是说该组未在正则表达式模式中定义,因此在匹配操作期间未填充。替换意味着获取所有匹配项,然后将它们替换为替换模式。在匹配阶段填充反向引用($xx构造)。该组在模式中缺失,因此在匹配期间没有填充,并且在替换阶段发生时仅使用空字符串。$1W
第 2 次和第 4 次替换很容易理解,并已在上述答案中进行了描述。只是$1反向引用第一个捕获组捕获的字符(用一对未转义括号括起来的子模式),与示例 4 相同。
您可以将其{}视为消除替换模式歧义的一种方法。
现在,如果您需要使结果一致,请使用命名捕获 (?P<1W>....):
re := regexp.MustCompile("a(?P<1W>x*)b") // <= See here, pattern updated
fmt.Println(re.ReplaceAllString("-ab-axxb-", "T"))
fmt.Println(re.ReplaceAllString("-ab-axxb-", "$1"))
fmt.Println(re.ReplaceAllString("-ab-axxb-", "$1W"))
fmt.Println(re.ReplaceAllString("-ab-axxb-", "${1}W"))
结果:
-T-T-
--xx-
--xx-
-W-xxW-
第 2 行和第 3 行现在产生一致的输出,因为命名组1W也是第一组,并且$1编号的反向引用指向使用命名 capture 捕获的相同文本$1W。
TA贡献1796条经验 获得超4个赞
$number 或 $name 是正则表达式或子组名称中子组的索引
fmt.Println(re.ReplaceAllString("-ab-axxb-", "$1"))
$1 是正则表达式中的子组 1 = x*
fmt.Println(re.ReplaceAllString("-ab-axxb-", "$1W"))
$1W 无子组名称 1W => 全部替换为空
fmt.Println(re.ReplaceAllString("-ab-axxb-", "${1}W"))
$1 和 ${1} 是一样的。用 W 替换所有子组 1
欲了解更多信息:https : //golang.org/pkg/regexp/
TA贡献1895条经验 获得超3个赞
$1
是一个简写 ${1}
${1}
是第一个 (1) 组的值,例如第一对 () 的内容。该组(x*)
即任意数量的x
。
ReplaceAllString
替换每场比赛。有两场比赛。第一个是ab
,第二个是axxb
。
否 2. 用组的内容替换任何匹配项:这是第一个匹配项中的“”和第二个匹配项中的“xx”。
4.在组内容后加一个“W”。
否 3. 留作练习。提示:第十二个捕获组是 12 美元。
- 3 回答
- 0 关注
- 189 浏览
添加回答
举报