当前位置: 首页 > 知识库问答 >
问题:

回火贪婪令牌-将点放在负面展望之前有什么不同?

戚锦
2023-03-14
<table((?!</table>).)*</table>

匹配我的所有表标记。然而

<table(.(?!</table>))*</table>

没有。如果我试着用文字写出表达,第二个似乎有意义,但我无法理解第一个。

有什么区别?

作为参考,我从这里得到了“钢化贪婪令牌”这个术语:钢化贪婪令牌解决方案

共有3个答案

祁通
2023-03-14
匿名用户

一个缓和的贪婪令牌实际上只是意味着:

匹配,但仅限于某一点

你是如何做到的:

您将不想匹配的令牌作为负前瞻(?!notAllowedToMatch)放在点的前面 (匹配任何一件事),然后用星号重复整个事情:

((?!不允许匹配)。)*

工作原理:

一遍又一遍地“看,吃一个”,在输入字符串中从左到右移动一个字符,直到看到不允许的序列(或字符串末尾),此时匹配停止。

Wiktor更详细的回答很好,但我只是觉得应该有一个更简单的解释。

梁丘逸仙
2023-03-14

((?!

<代码>(.(?!

请参见此处。

施彦
2023-03-14

rexegg.com炼成贪婪令牌参考相当简洁:

(?:(?!{ END}).)*中,*量词适用于一个点,但它现在是一个钢化的点。负前瞻(?!{END})断言当前位置后面的不是字符串{END}。因此,点永远无法匹配{END}的大括号,保证我们不会跳过{END}分隔符。

也就是说:调和贪婪令牌是字符序列的一种否定字符类(参见单个字符的否定字符类)。

注意:钢化贪心标记和否定字符类之间的区别在于,前者并不真正匹配序列本身以外的文本,而是不启动该序列的单个字符。即(?:(?! abc|xyz)。)不会匹配defDefabc中,但会匹配defbc,因为a启动禁止的abc序列,而bc不会。

它包括:

  • (?:...)*-量化的非捕获组(可能是捕获组,但捕获每个单独的字符没有意义)(a*可以是,这取决于是否期望空字符串匹配)
  • (?!...)-实际对当前位置右侧的值施加限制的负前瞻
  • .-(或任何(通常是单个)字符)消耗模式。

然而,我们总是可以通过在负前瞻中使用交替(例如:(?!{(?:END | START | MID)}))或通过用否定字符类替换所有匹配点(例如:(?:(!START | END | MID))来进一步调整令牌[^

注意,没有提到消费部分(原始令牌中的点)放置在前瞻之前的构造。阿维纳什的回答清楚地解释了这一部分:(.(?!

雷克塞格。com提供了一个想法:

  • 当我们想要在分隔符1和分隔符2之间匹配一个文本块,并且中间没有子字符串3时(例如,{START}(?:(?!{(?:MID | RESTART)})。*)*?{END}

由于在与消耗模式匹配的每个字符之后执行前瞻检查,因此混合贪婪令牌会消耗资源。展开循环技术可以显著提高令牌性能。

比方说,我们想在abc 1 abc 2 xyz 3 xyz中匹配abc 2 xyz。而不是用abc(?:(?! abc|xyz)检查abcxyz之间的每个字符。)*xyz,我们可以用[^ax]*跳过所有不是ax的字符,然后将所有a后面没有bc(带有a(?!bc))和所有x后面没有yz(带有x(?!yz)):abc[^ax]*(?: a(?! bc)[^ax]*|x(?! yz)[^ax]*)*xyz

 类似资料:
  • 贪婪 vs 不贪婪 当重复一个正则表达式时,如用 a*,操作结果是尽可能多地匹配模式。当你试着匹配一对对称的定界符,如 HTML 标志中的尖括号时这个事实经常困扰你。匹配单个 HTML 标志的模式不能正常工作,因为 .* 的本质是“贪婪”的 #!python >>> s = '<html><head><title>Title</title>' >>> len(s) 32 >>> print re.

  • 问题内容: 我有一个非常简单的正则表达式与此类似: 有了这个测试字符串… 我希望它能匹配(最短匹配,非贪婪) 相反,它匹配(最长的匹配,看起来很贪婪)。 为什么?如何使它匹配最短的匹配? 添加和删​​除的结果相同。 编辑 -更好的测试字符串,显示为什么不起作用: 我只能想到的是,它可能多次匹配-但只有一个匹配,所以我不明白为什么它没有采用以结尾的最短匹配,而丢弃了其余匹配。 我浏览了所有标题为“非

  • 我想从Stormpath帖子中对JWT令牌和CSRF提出疑问,这些令牌和CSRF解释了将JWT存储在localStorage或Cookie中的优缺点。 [...] 如果您使用JS从cookie中读取值,这意味着您不能在cookie上设置Httponly标志,因此现在站点上的任何JS都可以读取它,从而使其与在localStorage中存储内容的安全级别完全相同。 我试图理解为什么他们建议将xsrfT

  • 有一个问题让我意识到,在某些正则表达式引擎中,量词的贪婪程度并不总是一样的。从这个问题中提取正则表达式并稍加修改: (我知道在这里是多余的,但我发现下面的行为非常有趣) 如果我们试图与之匹敌: 我希望第一个捕获组为空,因为是懒惰的,它会在遇到第一个时停止。这确实是发生在: PCRE Python 但不是Javascript,它匹配整个。(jsfiddle) 我环顾了一下其他一些语言,比如ruby、

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

  • 本文向大家介绍贪婪算法相关面试题,主要包含被问及贪婪算法时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法。贪婪算法所得到的结果往往不是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果。贪婪算法并没有固定的算法解决框架,算法的关键是贪婪策