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

为什么(。*)*进行两次匹配并在组$ 1中什么也不选择?

许嘉福
2023-03-14
问题内容

这源于对正则表达式语法形式化的讨论。我已经通过几个正则表达式解析器看到了此行为,因此我将其标记为与语言无关。

采取以下表达式(针对您喜欢的语言进行调整):

replace("input", "(.*)*", "$1")

它将返回一个空字符串。为什么?

更奇怪的是,表达式replace("input", "(.*)*", "A$1B")将返回string ABAB。为什么双空比赛?

免责声明:
我知道回溯和贪婪的匹配,但是杰弗里·弗里德尔制定的规则似乎规定,.*匹配所有内容,并且不再进行进一步的回溯或匹配。那为什么是$1空的?

注意:
与比较(.+)*,返回输入字符串。但是,http://regexhero.com显示仍存在两个匹配项,出于与上述相同的原因,这似乎很奇怪。


问题答案:

让我们看看发生了什么:

  1. (.*)火柴"input"
  2. "input"被分组1
  3. 正则表达式引擎现在位于字符串的末尾。但是由于(.*)重复执行,因此将进行另一次匹配尝试:
  4. (.*)与后面的空字符串匹配"input"
  5. 空字符串被捕获到组1,覆盖"input"
  6. $1 现在包含空字符串。

评论中的一个好问题:

那为什么还replace("input", "(input)*", "A$1B")回来"AinputBAB"呢?

  1. (input)*火柴"input"。替换为"AinputB"
  2. (input)*匹配空字符串。它被替换为"AB"$1为空,因为它没有参加比赛)。
  3. 结果: "AinputBAB"


 类似资料:
  • 因为客户端和服务端都要确认连接,①客户端请求连接服务端;②针对客户端的请求确认应答,并请求建立连接;③针对服务端的请求确认应答,建立连接; 两次无法确保A能收到B的数据;

  • 我有一个组件,我设置了一个计数,让状态更新时,按钮点击。但是当我检查渲染时间时,每次我点击按钮它都会渲染两次。 https://codesandbox.io/s/brave-forest-yre6y?file=/src/App.js 我想知道: 为什么它是这样工作的

  • 本文向大家介绍请问tcp握手为什么两次不可以?为什么不用四次?相关面试题,主要包含被问及请问tcp握手为什么两次不可以?为什么不用四次?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 两次不可以:tcp是全双工通信,两次握手只能确定单向数据链路是可以通信的,并不能保证反向的通信正常 不用四次: 本来握手应该和挥手一样都是需要确认两个方向都能联通的,本来模型应该是: 1.客户端发送syn0给

  • react class组件在componentDidMount中调用初始化接口,有些时候会调用两次,通过断点发现顺序是componentDidMount->componentWillUnmount->componentDidMount,但不能稳定复现,调用的组件是页面的主入口,并非某个组件的子组件,请问有知道这个问题的么?

  • 已经7岁的Node.js,你还熟悉么? 以前?现在? 2.1. 回顾一下2015年Node.js的发展历史 http://i5ting.github.io/history-of-node-js/ 2.1.1. Q1(1季度) IO.js 1.0.0 发布 Joyent 推进建立 Node.js 基金会 Joyent, IBM, Microsoft, PayPal, Fidelity, SAP an

  • 问题内容: 是真的。 我知道Java中的整数是32位,并且不能超过2 31 -1,但是我不明白为什么要在其结果中加1 而不是某种例外。更不用说像Ruby这样的透明转换为更大的类型了。 是否在某处指定了此行为?我可以依靠吗? 问题答案: 因为整数溢出。溢出时,下一个值为。相关JLS 如果整数加法溢出,则结果是数学和的低阶位,以某种足够大的二进制补码格式表示。如果发生溢出,则结果的符号与两个操作数值的