当前位置: 首页 > 面试题库 >

去ReplaceAllString

向泽语
2023-03-14
问题内容

我从golang.org网站上阅读了示例代码。本质上,代码如下所示:

re := regexp.MustCompile("a(x*)b")
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-
---
-W-xxW-

我了解第一个输出,但不了解其余三个。有人可以向我解释结果2,3和4。谢谢。


问题答案:

最吸引人的是这fmt.Println(re.ReplaceAllString("-ab-axxb-", "$1W"))条线。该文件说:

在repl内部,$符号解释为Expand

并展开说:

在模板中,变量由$name或形式的子字符串表示${name},其中name是字母,数字和下划线的非空序列。
对超出范围或不匹配的索引的引用或在正则表达式中不存在的名称将替换为空切片。

$name形式中,名称应尽可能长:$1x等于${1x},不等于${1}x,并且$10等于${10},不等于${1}0

因此,在第三更换,$1W被视为${1W}由于此群体不被初始化,一个空字符串用于替换。

当我说“该组未初始化”时,我的意思是说该组未在正则表达式模式中定义,因此,在 匹配 操作期间未填充该组。 替换
意味着获取所有匹配项,然后将它们替换为替换模式。在 匹配 阶段将填充 反向引用$xx构造)。该模式中缺少该组,因此在 匹配
期间未填充该组,并且在发生 替换 阶段时仅使用一个空字符串。 $1W __

第二个和第四个替换项很容易理解,上面的答案中对此进行了描述。只是$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-

现在,第二行和第三行产生一致的输出,因为命名组1W也是 第一 组,并且$1编号的反向引用指向使用命名捕获捕获的相同文本$1W



 类似资料:
  • 背景25届专升本民办,有一段小公司实习经历 亚信一个月2600 不包吃住 个人想法是去混一俩个月至少亚信认识的人多简历至少比小公司(0-20)人好? --------------------------------- 面经 1. 从0写一个分页查询用mybayis-plus(三层架构) 2.使用流读取文件打印文件内容 3.怎么让一个时间戳按想要的格式打印(日期类) 4.list转map(strea

  • 在 MySQL 中使用 SELECT 语句执行简单的数据查询时,返回的是所有匹配的记录。如果表中的某些字段没有唯一性约束,那么这些字段就可能存在重复值。为了实现查询不重复的数据,MySQL 提供了 DISTINCT 关键字。 DISTINCT 关键字的主要作用就是对数据表中一个或多个字段重复的数据进行过滤,只返回其中的一条数据给用户。 DISTINCT 关键字的语法格式为: SELECT DIST

  • mysql锁怎么实现的 可重复读会有什么不好的地方 java怎么屏蔽cpu架构差异的(说了个英文我以为是java虚拟机内存布局,说我回答的不是一个东西) 线程池怎么确定核心线程数大小,有哪些依据 hashmap扩容,什么时候扩容(好像是负载因子 忘记了)为什么2的n次方(少回答了个,扩容时候作用)

  • 问题内容: 我有两个对象: 我怎么能在几分钟内发现它们之间的不同? 问题答案: 使用或,如api所述 0 0

  • 问题内容: 我对String Buffer玩了一点,并注意到混合使用char和String是一个坏主意。我希望我的以下代码可以打印“ Main”,但是只有一个“ ain”。 显然word是用字符串缓冲区构造函数的char版本初始化的,但是我测试了诸如toString或getIndex()之类的几种方法,但找不到“ ain”旁边的任何东西-这让我感到奇怪:构造函数做了什么?有用途吗?可以通过某种方式

  • 问题内容: 我知道Go中没有析构函数,因为从技术上讲没有类。这样,我用来执行与构造函数相同的功能。但是,有没有办法在终止的情况下创建某些东西来模仿析构函数,例如使用关闭文件?现在,我只是打电话给我,但这有点荒唐,我认为设计很差。正确的方法是什么? 问题答案: 在Go生态系统中,存在一种处理包装了宝贵(和/或外部)资源的对象的惯用语:一种专门用于释放该资源的特殊方法,通常通过该机制进行 显式 调用。