正则(?=.*[a-z])是什么意思?

问题一
.代表任意字符,(?=.*[a-z]) 表示任意字符拼接小写字母,那(?=[a-z])跟它有什么区别?
问题二
前瞻:exp1(?=exp2) 查找exp2前面的exp1,
后顾:(?<=exp2)exp1 查找exp2后面的exp1,
(?=.*[a-z]). 和 .(?=.*[a-z]) 我测试都能运行,反而(?<=.*[a-z]). 运行不了,是不是后顾表达式不能用 (?<=exp2)exp1 了?
问题三
用菜鸟工具正则表达式在线测试,abcD去匹配 (?=.*[a-z]). 匹配结果是 a b c,为什么a也能匹配,a的前面什么都没有啊!
最新回答
冭儍冭迗眞

2023-07-17 11:39:37

.代表任意字符,(?=.*[a-z]) 表示任意字符拼接小写字母,那(?=[a-z])跟它有什么区别?

首先 (?=xxx) 是 look ahead=你说的 前瞻

此处xxx的区别:

  • .*[a-z]:任意字符,且个数尽量多,后跟单个小写字母

    • 举例:12AB3c4d

  • [a-z]:单个小写字母

    • 举例:12AB3c4d 只能匹配到:12AB3c

      • 12AB3是前面部分

      • c是最后的[a-z]匹配的

-》其实,更准确的解释需要你给出完整的正则,而不仅仅是look ahead的部分,才能详细和精确解释匹配的内容和逻辑。


前瞻:exp1(?=exp2) 查找exp2前面的exp1,
后顾:(?<=exp2)exp1 查找exp2后面的exp1,
(?=.*[a-z]). 和 .(?=.*[a-z]) 我测试都能运行,反而(?<=.*[a-z]). 运行不了,是不是后顾表达式不能用 (?<=exp2)exp1 了?

不是。而是:

look behind=后顾 有个特殊的情况:只支持固定长度,比如123,而不支持不定长度的,比如\d+

你的 (?<=.*[a-z]). 中的 .*[a-z] ,属于正则写法,能匹配到不固定长度的字符,所以不支持,会报错的。

官网解释,详见python中的re

  • (?<=…)

  • 匹配字符串的当前位置,它的前面匹配 … 的内容到当前位置。这叫:dfn:positive lookbehind assertion(正向后视断定)。 (?<=abc)def 会在 'abcdef' 中找到一个匹配,因为后视会往后看3个字符并检查是否包含匹配的样式。包含的匹配样式必须是定长的,意思就是 abc 或 a|b 是允许的,但是 a* 和 a{3,4} 不可以。

注意其中的“包含的匹配样式必须是定长的”


用菜鸟工具正则表达式在线测试,abcD去匹配 (?=.*[a-z]). 匹配结果是 a b c,为什么a也能匹配,a的前面什么都没有啊!

建议换用更好用的

解释:

因为 你写的 (?=.*[a-z]).,其中的 .*[a-z] 含义是:任意字符,个数0或多个,后面跟着一个小写字母

而此处 之所以能匹配到a,是因为a前面有个 ^ 也叫 行首 =每个行的开始

对于正则来说,也是一个 不可见的特殊的字符。


更多正则的解释,详见我的教程:


顺带送上我刚整理的:

如图:

脸红妹妹

2021-04-29 04:06:10

在正则里面.*匹配任何的字母和符号,.*[a-z]的话匹配任何以小写字母结束的
字符串

[a-z]的话只能匹配一个小写的字母。

问题三里面那个ab是.*匹配的c是[a-z]匹配出来的。