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

为什么(。*)*进行两次匹配并在组$ 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

  • 问题内容: 我不明白为什么这个简单的正则表达式匹配不返回匹配对象。它返回None我在做什么错? 我完全是newby(昨天开始),想编写一个小程序来搜索文件夹树中的某些文件,打开这些文件并在这些文件中找到某些行,然后将这些行打印到一个新文件中。为了完成第一步,我想匹配os.walk返回的文件名,并使用某种模式进行匹配。因此,现在我正在检查正则表达式的工作方式,并且据我所知,以下代码应该匹配,但是当我