wps中正则函数怎么表达对仅符合多条件之一和同时符合多条件,用什么符号表达,返回true或false,isnumber与find的组合区别,?*=什么意思
浅谈出口账务和excel函数 在WPS表格中,正则函数主要有 REGEXp(判断是否匹配,返回TRUE/FALSE)。
正则本身没有“与/或”关键字,靠分组 + 量词 + 断言实现:
同时符合A和B (?=.*A)(?=.*B) 多个前瞻断言叠加
同时符合A、B、C (?=.*A)(?=.*B)(?=.*C) 依次叠加
=REGEXP(A1,"苹果|香蕉") // 含苹果或香蕉
=REGEXP(A1,"(?=.*苹果)(?=.*香蕉)") // 同时含苹果和香蕉
注意:(?=.*A) 是前瞻断言,只“看”不消耗字符,所以可以叠加多个实现“与”。顺序无所谓。
二、和 ISNUMBER+FIND、ISTEXT+FIND 的区别
=ISNUMBER(FIND("苹果",A1)) // 是否含"苹果"
=ISNUMBER(FIND("苹果",A1))*ISNUMBER(FIND("香蕉",A1)) // 与
=ISNUMBER(FIND("苹果",A1))+ISNUMBER(FIND("香蕉",A1)) // 或
对比项 REGEXP ISNUMBER+FIND ISTEXT+FIND
返回类型 直接TRUE/FALSE FIND返回位置数字,需ISNUMBER转布尔 FIND返回数字,ISTEXT判断的是FIND结果,逻辑上不对
大小写 默认区分,可加 (?i) 忽略 区分 区分
多条件“与” 一个正则 (?=.*A)(?=.*B) 多个FIND相乘/AND 不适用
通配/复杂模式 支持 \d、\w、量词等 只支持纯文本/通配符 同FIND
错误处理 不匹配返回FALSE,不报错 找不到返回#VALUE!,需ISNUMBER包裹 同FIND
1. ISTEXT+FIND 组合本身是错的。FIND 返回的是数字(位置)或错误值,ISTEXT(FIND(...)) 永远为 FALSE(数字不是文本),除非FIND返回错误时ISTEXT也判FALSE。正确应该用 ISNUMBER。所以这个组合没有实际判断意义。
2. REGEXP 一步到位返回布尔值;FIND 系列要先找位置再用 ISNUMBER 转换,多条件时还要用 *(与)、+(或)拼接,较繁琐。
3. REGEXp 支持复杂模式,如“以数字开头”“邮箱格式”“同时含字母和数字”等,FIND 做不到。
=REGEXP(A1,"(?=.*A)(?=.*B)")
或:=ISNUMBER(FIND("A",A1))+ISNUMBER(FIND("B",A1))>0
与:=AND(ISNUMBER(FIND("A",A1)),ISNUMBER(FIND("B",A1)))
总结:多条件“或”用 |,“与”用多个 (?=.*...) 前瞻断言;REGEXP 比 ISNUMBER+FIND 更简洁强大,而 ISTEXT+FIND 是逻辑错误组合,不建议使用。
在WPS正则(以及大多数正则引擎)里,? 和 * 都是量词,表示前面那个字符/分组出现的次数:
* 前面的元素出现 0次或多次 ab* a、ab、abb、abbb…
+ 前面的元素出现 1次或多次 ab+ ab、abb、abbb…
{n,m} n到m次 a{2,4} aa、aaa、aaaa
· ab* = a + (b出现0次或多次) → 匹配 "a"、"ab"、"abb"
· (ab)* = 分组"(ab)"出现0次或多次 → 匹配 ""、"ab"、"abab"
=REGEXTEST(A1,"(?=.*A)(?=.*B)")
从当前位置往后看,存在“任意字符 + A”,也就是后面某处有A。
(?=...) 是前瞻断言,只检查不消耗,所以可以叠加多个,实现“同时含有”。
1. ? 还有第二种用法:放在量词后面表示“非贪婪”,如 .*? 表示尽量少匹配。但单独 ? 作量词时就是“0或1次”。
* 前面必须有元素,不能单独用;.* 才是“任意内容”。(?=.*A) 不能写成 (?=*A),那是语法错误。
所以 (?=.*A)(?=.*B) 里,.* 负责“跳过前面任意内容”,A、B 负责“必须出现”,叠加起来就是“同时包含A和B”。
在正则表达式里,= 单独出现没有任何特殊含义,就是一个普通字符,匹配文本里的等号本身。
比如正则 a=b,就匹配字符串 "a=b"。
那为什么前面写法里有 =?
前面公式里的 (?=.*A),那个 = 不是独立的,它是前瞻断言语法的一部分:
写法 名称 含义
(?=...) 正向前瞻 后面必须有...
(?!...) 负向前瞻 后面必须没有...
(?<=...) 正向后顾 前面必须有...
(?<!...) 负向后顾 前面必须没有...
关键点:? = 连在一起才是语法,(?= 是一个整体记号。
· (?=.*A) → 断言“后面某处有A”
· 单独的 = → 普通等号字符
容易混淆的地方
?= 和 ?<= 里的符号,要看括号里的第一个字符:
括号开头 含义
(?= 正向前瞻
(?! 负向前瞻
(?<= 正向后顾
(?<! 负向后顾
注意 (?<= 是 ? < = 三个符号连用,这里的 = 也是语法一部分,别和“小于等于”混淆。
小结
· 正则里光一个 =:普通字符,匹配等号。
· (?=:前瞻断言的开头,整体是语法。
· 前面 (?=.*A)(?=.*B) 里的 = 属于 (?= 这个组合,不是“等于”的意思。
所以别把 (?= 拆成 ? 和 = 去理解,要当成一个整体记号。