本帖最后由 龙逸凡 于 2024-9-11 13:35 编辑
第五句字符只能被匹配一次,位置可以被多次匹配。 比如下面的示例: 公式: =REGEXP(B1,".e",2,"@")
B1单元格内容是“eel”,用正则表达式".e"去匹配,首先用"."去匹配,第一个"e"能匹配上,被消耗掉(后面的正则表达式就不能再匹配此字符了)。然后用正则表达式中的"e"去匹配字符串中的第二个"e",也能匹配上。 但是,位置被匹配后,并不会被消耗掉,还能被其他的正则表达式匹配。 比如公式: =REGEXP(B1,"^(?=E)\A",2,"@")
首先用^去匹配,会被匹配到字符串的开头,这位置不会被消耗掉。 接着,用(?=E)去匹配,匹配到的还是"E"前面的位置,也就是字符串的开头。 接着,又去用\A去匹配,这是字符串的绝对开头,匹配的还是字符串的开始处。 也就是说字符串的“开始”这个位置被匹配了三次。 现在再来做=REGEXP("Excel","^^^",2,"@")这道题,你就知道其计算结果是“@Excel”了。
龙逸凡:现在你终于知道为什么找不到喜欢的人了吧? 偷懒读者:为啥? 龙逸凡:就三个备选答案,你都能完美地错过正确答案,你还指望能从14亿中准确地找到你喜欢的人? 偷懒读者:
我们来看看这个知识点的实战应用案例
案例7:在前面的案例6给银行账号从后往前每4位添加逗号,当账号长度是4的倍数时,会在最前面多出一个逗号。如下图
如何避免这种情况呢? 我们只需在原正则表达式的基础上,再添加一个位置判断: 当是行首时,就不添加逗号。 换另一种表达: 当不是行首时,才添加逗号 完整的条件是: 从后往前,每四位所在的位置,并且不是行首的位置处,加一个逗号。 公式: =REGEXP(B33,"(?!^)(?=(\d{4})+$)",2,",")
扩展案例1:给字符串中的数字添加千位分隔符,但不能给年份添加。公式: =REGEXP(B1,"(?<=\d)(?=(?:\d{3})+($|[^\d年]))",2,",")
扩展案例2密码校验:由数字字母下划线组成,长度不少于八位。且至少一个大写字母、一个小写字母、一个数字 公式: =REGEXP(B5,"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)\w{8,}$",1)
知识点: (?=.*[A-Z]) (?=.*[a-z]) (?=.*[0-9])
扩展案例3判断字符串中是否不包含XXX 公式 =REGEXP(B5,"^((?!52|1234).)*$",1)
知识点: ^((?!字符串).)*$ 利用位置可以被多次匹配的特性,还能解决“前面是 (?<=...)” 和“前面不是 (?<!...)”位置匹配模式下,不能使用不确定量词的问题。
案例7:B列是一些订单数据,现在要求在其金额后添加“元”字,但不能在编号数字后添加“元”,已有“元”的也不再能添加。 分析: …… 完整的公式: =REGEXP(B3,"(?<!编[号码])(?<!编[号码][::])\b([0-9.]+)(\r|\n|$)",2,"\1元\2") 第五句不太好理解,大家慢慢消化。 附上在字符间各种花式插入星号的正则表达式 |