正则表达式字符类中能否使用断言?匹配特定格式字符串的正则需求
正则表达式字符类中能否使用断言?
我需要编写一个正则表达式,匹配包含字母、空格以及后跟英文句点的数字的字符串。数字可出现在字符串任意位置,且可存在多个。示例如下:
Foo -> Match Foo Bar -> Match Foo 1 Bar -> No Match Foo 1. Bar -> Match Foo 11. Bar -> Match 1. Foo 11. Bar -> Match
我知道可以用[a-zA-Z ]+匹配字母和空格,用\d+(?=\.)匹配后跟句点的数字,但将后者插入前者时,会匹配所有数字以及字面字符'+', '(', '?', '=', '.'和')'。请问是否有实现该需求的方法?
解答
首先明确:字符类([])里不能直接使用断言。字符类的作用是匹配单个字符,断言属于零宽匹配的逻辑结构,放进字符类里会被当成普通的字面字符处理,这就是你遇到那些特殊字符被错误匹配的原因。
要实现需求,不需要把断言塞进字符类,而是通过组合模式来整体约束字符串:
方案1:正向构建合法内容
使用这个正则可以精准匹配所有符合要求的字符串:
^[a-zA-Z ]*(?:\d+\.[a-zA-Z ]*)*$
各部分解释:
^和$:锁定字符串首尾,确保整个内容都符合规则[a-zA-Z ]*:匹配任意数量的字母或空格(?:\d+\.[a-zA-Z ]*)*:重复匹配“后跟句点的数字 + 任意字母/空格”的组合,(?:...)是非捕获组,仅用于分组不存储匹配结果
方案2:反向排除非法内容
通过负前瞻断言排除存在“不后跟句点的数字”的字符串,写法更简洁:
^(?!.*\d(?!\.))[a-zA-Z \d.]+$
各部分解释:
(?!.*\d(?!\.)):负前瞻断言,确保字符串中不存在任何数字后面不跟句点的情况[a-zA-Z \d.]+:匹配仅包含字母、空格、数字和句点的字符串
两种方案都能完美匹配你给出的示例场景,可根据习惯选择使用。
内容的提问来源于stack exchange,提问作者TigersEye120
相关产品推荐
相关产品推荐

