Regex 两者的区别是什么?和。*正则表达式?

Regex 两者的区别是什么?和。*正则表达式?,regex,regex-greedy,non-greedy,Regex,Regex Greedy,Non Greedy,我正在尝试使用正则表达式将字符串分成两部分。字符串的格式如下所示: text to extract<number> 我一直在使用。*?假设您: <a></a> 将匹配一个>。它检查一个 或0个匹配项,后跟下一个表达式 匹配第一个>时,第一个表达式不会停止。它将持续到最后一次匹配>这是贪婪量词和非贪婪量词之间的区别 考虑输入101000000000100 使用1.*1,*是贪婪的-它将一直匹配到最后,然后回溯到它可以匹配1,留下1010000000001。

我正在尝试使用正则表达式将字符串分成两部分。字符串的格式如下所示:

text to extract<number>
我一直在使用。*?假设您:

<a></a>
将匹配一个>。它检查一个 或0个匹配项,后跟下一个表达式


匹配第一个>时,第一个表达式不会停止。它将持续到最后一次匹配>

这是贪婪量词和非贪婪量词之间的区别

考虑输入101000000000100

使用1.*1,*是贪婪的-它将一直匹配到最后,然后回溯到它可以匹配1,留下1010000000001。 .*? 是非贪婪的。*将不匹配任何内容,但随后将尝试匹配额外字符,直到匹配1,最终匹配101

所有量词都有一个非贪婪模式:.*?、.+?、.{2,6}和偶数

在您的例子中,类似的模式可能是]*>-匹配除大于号以外的任何字符严格来说,它匹配零个或多个字符,而不是中间的>字符

请参阅。

关于贪婪与非贪婪的比较 默认情况下,regex中的重复是贪婪的:他们尝试匹配尽可能多的重复,当这不起作用并且他们必须回溯时,他们尝试一次少匹配一个重复,直到找到整个模式的匹配。因此,当匹配最终发生时,贪婪的重复将匹配尽可能多的重复

eeeAiiZuuuuAoooZeeee
   \_______________/
    A.* matched, Z can't match
那个?作为一个重复量词,它将这种行为转变为非贪婪行为,也被称为不情愿行为,有时甚至是懒惰行为。相反,这种重复将首先尝试匹配尽可能少的重复,当这不起作用并且他们必须回溯时,他们开始一次匹配更多的重复。因此,当比赛最终发生时,不情愿的重复将匹配尽可能少的重复

eeeAiiZuuuuAoooZeeee
   \_______________/
    A.* matched, Z can't match
工具书类 示例1:从A到Z 让我们比较这两种模式:A.*Z和A.*Z

考虑到以下输入:

eeeAiiZuuuuAoooZeeee
这些模式产生以下匹配:

A.*Z产生1个匹配项:aiizuuaoooz A.*Z产生2个匹配项:AiiZ和AoooZ 让我们首先关注*Z的作用。当它匹配第一个A时,由于贪婪,第一个尝试匹配尽可能多的A。尽可能的

eeeAiiZuuuuAoooZeeee
   \_______________/
    A.* matched, Z can't match
由于Z不匹配,因此引擎会回溯,并且。*必须少匹配一个:

这种情况还会发生几次,直到我们最终得出结论:

eeeAiiZuuuuAoooZeeee
   \__________/
    A.* matched, Z can now match
现在Z可以匹配,因此整体模式匹配:

eeeAiiZuuuuAoooZeeee
   \___________/
    A.*Z matched
相比之下,在。*?Z中不情愿的重复首先匹配的是很少的。尽可能,然后多吃点。必要时。这解释了为什么它在输入中找到两个匹配项

这是两种模式匹配的视觉表现:

eeeAiiZuuuuAoooZeeee
   \__/r   \___/r      r = reluctant
    \____g____/        g = greedy
示例:另一种选择 在许多应用程序中,上述输入中的两个匹配项是所需的,因此是?用于代替贪婪的。*以防止过度匹配。然而,对于这个特定的模式,有一个更好的选择,使用否定字符类

对于上述输入,模式A[^Z]*Z也会找到与A.*Z模式相同的两个匹配项。[^Z]是所谓的否定字符类:它匹配除Z以外的任何字符

这两种模式的主要区别在于性能:由于更严格,求反字符类只能为给定输入匹配一种方式。对于这个模式,使用贪婪或不情愿的修饰符并不重要。事实上,在某些方面,你甚至可以做得更好,使用所谓的所有格量词,它一点也不倒退

工具书类 和 例2:从A到ZZ 这个例子应该是说明性的:它展示了贪婪、不情愿和否定的字符类模式如何在相同的输入下进行不同的匹配

eeAiiZooAuuZZeeeZZfff
以下是上述输入的匹配项:

一个[^Z]*ZZ产生一个匹配项:AuuZZ A.*ZZ产生1个匹配项:Aiizoauuzz A.*ZZ产生1个匹配项:Aiizoouzzeeez 以下是他们匹配的视觉表现:

         ___n
        /   \              n = negated character class
eeAiiZooAuuZZeeeZZfff      r = reluctant
  \_________/r   /         g = greedy
   \____________/g
相关话题 这些是有关stackoverflow的问题和答案的链接,涉及一些可能感兴趣的主题

一次贪婪的重复可以胜过另一次贪婪
我想说的是rubular.com,不是ideone.com。对其他人说:不要为我修改这篇文章,我会在下一次修改时自己修改,还有其他例子。请随时在评论中给出反馈、建议等,以便我也能将其纳入。另请参见:此答案已添加到“量词>更多差异”下……此答案确实值得选择!。非常感谢您的详细解释。我添加了标签。为什么,因为这个问题需要它,但也因为它会吸引更多的用户找到这个伟大的答案。换句话说,如果你给出了一个很好的答案,并且答案使用了一个不在问题中的标记,那么就添加标记,因为OP不知道标记是狂欢。啊,太好了,我喜欢最后一个标记,除了>符号!你能解释或举例说明贪婪的人是如何做到的吗?不同于非贪婪?当然对于字符串abc
,regex/\w\w?\w/将与完整字符串abc匹配-因为?他很贪婪/\w\w???\w/是惰性的-它将只匹配ab。如果以后失败,它将只回溯并匹配abc。另请参见,这比上面的解释更容易理解。这就是解释应该是什么。