ARTICLE · 1007518
wps中正则函数怎么表达对仅符合多条件之一和同时符合多条件,用什么符号表达,返回true或false,isnumber与find的组合区别,?*=什么意思
wps中正则函数怎么表达对仅符合多条件之一和同时符合多条件,用什么符号表达,返回true或false,isnumber与find的组合区别,?*=什么意思在WPS表格中,正则函数主要有 REGEXp(判断是否匹配,返回TRUE/FALSE)。 一、多条件“或”与“与”的正则表达 正则本身没有“与/或”关键字,靠分组 + 量词 + 断言实现: 需求 正则写法 含义 符合A或B之一 `A B` 同时符合A和B (?=.*A)(?=.*B) 多个前瞻断言叠加 同时符合A、B、C (?=.*A)(?=.*B)(?=.*C) 依次叠加 公式示例(假设判断A1): ``` =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 不适用 多条件“或” `A B` 多个FIND相加/OR 通配/复杂模式 支持 \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 做不到。 三、推荐写法 或(含A或B): ``` =REGEXP(A1,"A|B") ``` 与(同时含A和B): ``` =REGEXP(A1,"(?=.*A)(?=.*B)") ``` 忽略大小写: ``` =REGEXP(A1,"(?i)apple") ``` ``` 或:=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… ? 前面的元素出现 0次或1次 ab? a、ab + 前面的元素出现 1次或多次 ab+ ab、abb、abbb… {n} 恰好n次 a{3} aaa {n,} 至少n次 a{2,} aa、aaa… {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)") ``` 拆开看 .*: · . = 任意一个字符(除换行) · * = 前面的 . 出现0次或多次 · .* = 任意长度的任意字符(可以是空) 所以 (?=.*A) 的意思是: 从当前位置往后看,存在“任意字符 + A”,也就是后面某处有A。 (?=...) 是前瞻断言,只检查不消耗,所以可以叠加多个,实现“同时含有”。 三、易混点 1. ? 还有第二种用法:放在量词后面表示“非贪婪”,如 .*? 表示尽量少匹配。但单独 ? 作量词时就是“0或1次”。 2. * 和 ? 的区别: · * 允许 0 次 → 可以什么都不匹配 · ? 允许 0 或 1 次 → 最多一个 3. 在“与”写法里为什么用 .* 而不是 *: * 前面必须有元素,不能单独用;.* 才是“任意内容”。(?=.*A) 不能写成 (?=*A),那是语法错误。 四、小结 你看到 读作 作用 * 星号 前面元素 0 次或多次 ? 问号 前面元素 0 次或 1 次 .* 点星 任意长度的任意字符 .*? 点星问 任意字符,但尽量少匹配 所以 (?=.*A)(?=.*B) 里,.* 负责“跳过前面任意内容”,A、B 负责“必须出现”,叠加起来就是“同时包含A和B”。 在正则表达式里,= 单独出现没有任何特殊含义,就是一个普通字符,匹配文本里的等号本身。
比如正则 a=b,就匹配字符串 "a=b"。
那为什么前面写法里有 =?
前面公式里的 (?=.*A),那个 = 不是独立的,它是前瞻断言语法的一部分:
写法 名称 含义
(?=...) 正向前瞻 后面必须有...
(?!...) 负向前瞻 后面必须没有...
(?<=...) 正向后顾 前面必须有...
(?<!...) 负向后顾 前面必须没有...
关键点:? = 连在一起才是语法,(?= 是一个整体记号。
· (?=.*A) → 断言“后面某处有A”
· 单独的 = → 普通等号字符
容易混淆的地方
?= 和 ?<= 里的符号,要看括号里的第一个字符:
括号开头 含义
(?= 正向前瞻
(?! 负向前瞻
(?<= 正向后顾
(?<! 负向后顾
注意 (?<= 是 ? < = 三个符号连用,这里的 = 也是语法一部分,别和“小于等于”混淆。
小结
· 正则里光一个 =:普通字符,匹配等号。
· (?=:前瞻断言的开头,整体是语法。
· 前面 (?=.*A)(?=.*B) 里的 = 属于 (?= 这个组合,不是“等于”的意思。
所以别把 (?= 拆成 ? 和 = 去理解,要当成一个整体记号。
比如正则 a=b,就匹配字符串 "a=b"。
那为什么前面写法里有 =?
前面公式里的 (?=.*A),那个 = 不是独立的,它是前瞻断言语法的一部分:
写法 名称 含义
(?=...) 正向前瞻 后面必须有...
(?!...) 负向前瞻 后面必须没有...
(?<=...) 正向后顾 前面必须有...
(?<!...) 负向后顾 前面必须没有...
关键点:? = 连在一起才是语法,(?= 是一个整体记号。
· (?=.*A) → 断言“后面某处有A”
· 单独的 = → 普通等号字符
容易混淆的地方
?= 和 ?<= 里的符号,要看括号里的第一个字符:
括号开头 含义
(?= 正向前瞻
(?! 负向前瞻
(?<= 正向后顾
(?<! 负向后顾
注意 (?<= 是 ? < = 三个符号连用,这里的 = 也是语法一部分,别和“小于等于”混淆。
小结
· 正则里光一个 =:普通字符,匹配等号。
· (?=:前瞻断言的开头,整体是语法。
· 前面 (?=.*A)(?=.*B) 里的 = 属于 (?= 这个组合,不是“等于”的意思。
所以别把 (?= 拆成 ? 和 = 去理解,要当成一个整体记号。