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。另请参见,这比上面的解释更容易理解。这就是解释应该是什么。