gpt4 book ai didi

正则表达式前瞻排序

转载 作者:行者123 更新时间:2023-12-04 13:29:52 25 4
gpt4 key购买 nike

我对正则表达式相当不错,现在我再次尝试理解前瞻和后视断言。它们大多是有道理的,但我不太确定顺序如何影响结果。我一直在看this site它在表达式之前放置lookbehinds,在表达式之后放置lookaheads。我的问题是,这会改变什么吗?最近在 SO 上的一个答案将前瞻放在了导致我困惑的表达式之前。

最佳答案

当教程介绍环视时,他们倾向于为每个用例选择最简单的用例。所以他们会使用像 (?<!a)b 这样的例子。 ('b' 前面没有 'a') 或 q(?=u) (“q”后跟“u”)。这只是为了避免用分散注意力的细节来混淆解释,但它往往会创造(或强化)后视和前瞻应该以特定顺序出现的印象。我花了很长时间才克服了这个想法,我也看到其他几个人也受到了这个想法的困扰。

试着看一些更现实的例子。经常出现的一个问题是验证密码;例如,确保新密码长度至少为六个字符,并且至少包含一个字母和一个数字。一种方法是:

^(?=.*[A-Za-z])(?=.*\d)[A-Za-z0-9]{6,}$

字符类 [A-Za-z0-9]{6,}可以匹配所有字母或所有数字,因此您可以使用前瞻来确保每个字母至少有一个。在这种情况下,您必须先进行前瞻,因为正则表达式的后面部分必须能够检查整个字符串。

再举一个例子,假设您需要查找所有出现的单词“there”,除非它前面有引号。明显的正则表达式是 (?<!")[Tt]here\b ,但如果您要搜索大型语料库,则可能会造成性能问题。正如所写的那样,该正则表达式将在文本中的每个位置进行负向后视,只有当成功时,它才会检查正则表达式的其余部分。

每个正则表达式引擎都有自己的优点和缺点,但所有这些引擎都有一个特点,那就是它们比其他任何东西都能更快地找到固定的文字字符序列——序列越长越好。这意味着最后执行lookbehind可以显着更快,即使这意味着匹配单词两次:
[Tt]here\b(?<!"[Tt]here)

所以管理环视位置的规则是没有规则;在每种情况下,您都可以将它们放在最有意义的地方。

关于正则表达式前瞻排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2126137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com