大数跨境

wps中正则函数怎么表达对仅符合多条件之一和同时符合多条件,用什么符号表达,返回true或false,isnumber与find的组合区别,?*=什么意思

wps中正则函数怎么表达对仅符合多条件之一和同时符合多条件,用什么符号表达,返回true或false,isnumber与find的组合区别,?*=什么意思 浅谈出口账务和excel函数
2026-09-15
3
在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) 里的 = 属于 (?= 这个组合,不是“等于”的意思。

所以别把 (?= 拆成 ? 和 = 去理解,要当成一个整体记号。

【声明】内容源于网络
0
0
浅谈出口账务和excel函数
1234
内容 1428
粉丝 0
浅谈出口账务和excel函数 1234
总阅读22.8k
粉丝0
内容1.4k