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

为什么简单的。*?非贪婪正则表达式在比赛之前贪婪地包含其他字符?

隆功
2023-03-14
问题内容

我有一个非常简单的正则表达式与此类似:

HOHO.*?_HO_

有了这个测试字符串…

fiwgu_HOHO_HOHO_HOHOrgh_HOHO_feh_HOHO___HO_fbguyev

  • 我希望它能匹配_HOHO___HO_(最短匹配,非贪婪)
  • 相反,它匹配_HOHO_HOHO_HOHOrgh_HOHO_feh_HOHO___HO_(最长的匹配,看起来很贪婪)。

为什么?如何使它匹配最短的匹配?

添加和删​​除的?结果相同。

编辑
-更好的测试字符串,显示为什么[^HOHO]不起作用:fiwgu_HOHO_HOHO_HOHOrgh_HOHO_feh_HOHO_H_O_H_O_HO_fbguye

我只能想到的是,它可能多次匹配-但只有一个匹配_HO_,所以我不明白为什么它没有采用以结尾的最短匹配_HO_,而丢弃了其余匹配。

我浏览了所有标题为“非贪婪正则表达式贪婪”之类的问题,但它们似乎都存在其他问题。


问题答案:

如果一个左手比赛有很多左手比赛,它将始终从到达的第一个开始(实际上会给出 最长的 比赛)。

本质上,它一次穿过字符串一个字符,询问“此字符是否匹配?如果匹配,则匹配最短的字符并结束。如果不匹配,则移动到下一个字符,重复”。我希望它是“此字符串中是否有任何匹配项?如果是,则匹配所有字符串中最短的一个”。

通过用.表示“不是左侧匹配”的否定替换,可以在两个方向上近似表示非贪婪的正则表达式。要否定这样的字符串,需要否定先行和不捕获组,但这就像将字符串放入一样简单(?:(?!).)。例如,(?:(?!HOHO).)

例如,左右等价于HOHO.*?_HO_非贪婪的等价于:

HOHO(?:(?!HOHO).)*?_HO_

因此,正则表达式引擎实质上是通过每个字符来进行如下操作:

  • HOHO -这与左侧匹配吗?
  • (?:(?!HOHO).)* -如果是这样,我能否到达右侧而不重复左侧?
  • _HO_ -如果是这样,抓住所有东西,直到进行右侧比赛
  • ?``*或上的修饰符+-如果有多个右手匹配项,请选择最接近的一个


 类似资料:
  • 本文向大家介绍php正则表达式中贪婪与非贪婪介绍,包括了php正则表达式中贪婪与非贪婪介绍的使用技巧和注意事项,需要的朋友参考一下 一、贪婪与非贪婪 什么叫贪婪,比如说要从字符串中<td>面包一</td><td>面包二</td>吃面包,本来你只可以吃面包一,可是你贪心,于是就把第一个<td>到最后一个</td>里面的两个面包取出来了,你想多吃点,非贪婪也就是你不贪吃了,就只吃面包一。 我们来看看正

  • 本文向大家介绍Python正则表达式教程之三:贪婪/非贪婪特性,包括了Python正则表达式教程之三:贪婪/非贪婪特性的使用技巧和注意事项,需要的朋友参考一下 之前已经简单介绍了Python正则表达式的基础与捕获,那么在这一篇文章里,我将总结一下正则表达式的贪婪/非贪婪特性。  贪婪 默认情况下,正则表达式将进行贪婪匹配。所谓“贪婪”,其实就是在多种长度的匹配字符串中,选择较长的那一个。例如,如下

  • 问题内容: 我如何制作像这样的python正则表达式,使得在给定的情况下,python匹配而不是? 我知道我可以使用代替,但是我正在寻找一种更通用的解决方案,使我的regex更加整洁。有什么办法告诉python“嘿,尽快匹配它”? 问题答案: 您寻找功能强大的吗? http://docs.python.org/3/howto/regex.html#greedy-versus-non-greedy

  • 问题内容: 我有下一个代码: 并具有下一个输出: 但我认为它必须是: 有人请解释为什么。 问题答案: 由于您的模式是非贪婪的,因此它们在仍由匹配项组成的情况下,匹配的文本越少越好。 去除 ?在第二组中,您会得到 单词 word word big small

  • 问题内容: 我主要关心的是Java风格,但是我也希望了解其他信息。 假设您有一个像这样的子模式: 虽然这不是很有用,但可以说这两个捕获组(例如和)是更大模式的一部分,该模式与对这些组的反向引用匹配,依此类推。 因此,两者都是贪婪的,因为他们试图捕获尽可能多的东西,只在需要时花更少的时间。 我的问题是:谁更贪婪?是否获得优先权,仅在必要时才分配份额? 关于什么: 假设确实获得了优先权。假设它过于贪婪

  • 问题内容: 我正在使用jQuery。我有一个带有特殊字符块的字符串(开头和结尾)。我想从特殊字符块中获取文本。我使用正则表达式对象进行字符串内查找。但是当有两个或两个以上特殊字符时,如何告诉jQuery查找多个结果? 我的HTML: 和我的JavaScript代码: 我的结果是: [|cơthử|nghiệm|] thtr trng [| test2 |đâylàtestlần2 |]chứngk