当教程介绍外观时,他们倾向于为每个用例选择最简单的用例.所以他们会使用像(?<!a)b('b'前面没有'a')或q(?=u)('q'后跟'u')这样的例子.这只是为了避免使用令人分心的细节混淆解释,但它往往会产生(或强化)外观和前瞻应按某种顺序出现的印象.我花了很长时间来克服这个想法,而且我也看到了其他几个受其影响的人.
试着看一些更现实的例子.出现的一个问题涉及验证密码; 例如,确保新密码长度至少为六个字符,并且至少包含一个字母和一个数字.一种方法是:
^(?=.*[A-Za-z])(?=.*\d)[A-Za-z0-9]{6,}$
Run Code Online (Sandbox Code Playgroud)
字符类[A-Za-z0-9]{6,}可以匹配所有字母或所有数字,因此您使用前瞻以确保每个字符中至少有一个.在这种情况下,你必须做的向前看符号第一,因为正则表达式的后面部分必须能够检查整个字符串.
再举一个例子,假设你需要找到所有出现的单词"there",除非它前面带有引号.显而易见的正则表达式是(?<!")[Tt]here\b,但如果您正在搜索大型语料库,则可能会产生性能问题.如上所述,正则表达式将在文本中的每个位置执行负面的lookbehind,并且只有在成功时才会检查正则表达式的其余部分.
每个正则表达式引擎都有自己的优点和缺点,但有一点是真实的,就是它们能够更快地找到文字字符的固定序列而不是其他任何东西 - 序列越长越好.这意味着最后进行lookbehind可以大大加快,即使这意味着匹配两次单词:
[Tt]here\b(?<!"[Tt]here)
Run Code Online (Sandbox Code Playgroud)
因此,规范外观的规则是没有规则; 你把它们放在每种情况下最有意义的地方.
| 归档时间: |
|
| 查看次数: |
1568 次 |
| 最近记录: |