<table((?!</table>).)*</table>
匹配我的所有表标记。然而
<table(.(?!</table>))*</table>
没有。如果我试着用文字写出表达,第二个似乎有意义,但我无法理解第一个。
有什么区别?
作为参考,我从这里得到了“钢化贪婪令牌”这个术语:钢化贪婪令牌解决方案
匿名用户
一个缓和的贪婪令牌实际上只是意味着:
匹配,但仅限于某一点
你是如何做到的:
您将不想匹配的令牌作为负前瞻(?!notAllowedToMatch)放在点的前面
(匹配任何一件事),然后用星号重复整个事情:
((?!不允许匹配)。)*
工作原理:
一遍又一遍地“看,吃一个”,在输入字符串中从左到右移动一个字符,直到看到不允许的序列(或字符串末尾),此时匹配停止。
Wiktor更详细的回答很好,但我只是觉得应该有一个更简单的解释。
((?!
<代码>(.(?!
请参见此处。
rexegg.com炼成贪婪令牌参考相当简洁:
在(?:(?!{ END}).)*
中,*
量词适用于一个点,但它现在是一个钢化的点。负前瞻(?!{END})
断言当前位置后面的不是字符串{END}
。因此,点永远无法匹配{END}
的大括号,保证我们不会跳过{END}
分隔符。
也就是说:调和贪婪令牌是字符序列的一种否定字符类(参见单个字符的否定字符类)。
注意:钢化贪心标记和否定字符类之间的区别在于,前者并不真正匹配序列本身以外的文本,而是不启动该序列的单个字符。即(?:(?! abc|xyz)。)
不会匹配def
在Defabc
中,但会匹配def
和bc
,因为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)检查
,我们可以用abc
和xyz
之间的每个字符。)*xyz[^ax]*
跳过所有不是a
或x
的字符,然后将所有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正则表达式的基础与捕获,那么在这一篇文章里,我将总结一下正则表达式的贪婪/非贪婪特性。 贪婪 默认情况下,正则表达式将进行贪婪匹配。所谓“贪婪”,其实就是在多种长度的匹配字符串中,选择较长的那一个。例如,如下
本文向大家介绍贪婪算法相关面试题,主要包含被问及贪婪算法时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法。贪婪算法所得到的结果往往不是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果。贪婪算法并没有固定的算法解决框架,算法的关键是贪婪策