先行断言(?=...)和(?!...)不消耗字符,仅检查后续是否匹配或不匹配指定模式;正向要求后面满足条件,负向要求后面不能满足条件,均不改变匹配位置。
正则中的先行断言(Lookahead)不消耗字符,只做“检查”,匹配成功与否取决于其内部子表达式能否在当前位置向右匹配成功,但匹配位置不会移动。
正向先行断言
(?=...)
的工作方式
它要求紧接当前匹配位置之后的字符串必须满足括号内的条件,但不把这部分内容纳入最终匹配结果。
引擎在尝试匹配主模式前,先“偷看”后面是否符合
中的规则
如果符合,继续匹配主模式;不符合,直接回溯或失败
匹配过程不推进索引,即断言部分不被“吃掉”
例如:
匹配后面跟着空格和 "USD" 的数字,但结果中只有数字,不含 "USD" 或空格。
负向先行断言
(?!...)
的作用逻辑
与正向相反,它要求当前位置之后**不能**匹配括号内的模式,否则整个断言失败。
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
下载
立即学习
“
Java免费学习笔记(深入)
”;
常用于排除特定后缀,比如匹配不是以 ".js" 结尾的文件名
写法如:
—— 要求文件扩展名前的部分不能是 ".js"
注意:
本身不匹配任何字符,仅否定后续可能性
常见误区与关键细节
很多人误以为先行断言会“跳过”某些字符参与匹配,其实它只是条件检查,不影响主匹配的起始点。
断言内部不能使用捕获组来影响外部匹配位置(但可以有分组,用于内部逻辑)
表示“匹配 b,但前提是 b 前面是 a”——不对!正确理解是:“匹配 b,且 b 的位置后面必须能匹配 a”。实际应写作
才表示“匹配 a,且 a 后面是 b”
多个断言可叠加,如
表示匹配同时包含数字和小写字母的单词(需配合全局逻辑)
实用技巧:用先行断言实现“零宽”校验
当需要验证某段文本满足多个条件,又不想重复匹配或拆分处理时,先行断言非常高效。
密码强度校验:
—— 每个
都从字符串开头检查是否存在对应字符,互不干扰
提取标签但排除注释:
—— 排除
(?=...)/\d+(?=\s*USD)//\w+(?!\.js$)\.\w+$/(?!...)(?=a)ba(?=b)/(?=\d)(?=[a-z])\w+/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$(?=.*...)/]*>/g