WPS Excel本身没有正则表达式函数,可以利用 wps js自定义函数的功能来封装正则表达式函数,这样可以直接在单元格里用公式来使用正则表达式,wps2020以后的版本只要支持js宏都可以用,先看动画效果:
一、RegExpMatch函数,提取匹配到的字符
只要把代码保存为xlam加载宏文件,然后再添加到加载项里,所有的工作簿都可以使用自定义函数,js源码在最下面
一、RegExpMatch函数,提取匹配到的字符
=RegExpMatch(字符串(必选), 匹配模式(必选), 索引(可选), 连接符(可选))
字符串:引用单元格或者直接输入文本都可以
匹配模式:/表达式/修饰符,例如匹配连续数字:\d+,要写成/\d+/
全局匹配写成/\d+/g;全局匹配字母忽略大小写 /title/gi
修饰符g表示全局、i忽略大小写、m多行模式、s包括换行符
索引:返回匹配到的第几个项
连接符:指定字符拼接所有匹配到的文本
案例:用换行符拼接提取到的全部137、189、166开头的手机号
字符串:15555555555、13716888157、17766688888、16655、16677788786、18916888689
匹配模式:(137|189|166)\d{8} 写成 /(137|189|166)\d{8}/g 即可
二、RegExpReplace函数,替换匹配到的字符
=RegExpReplace(字符串(必选), 匹配模式(必选), 替换的文本(必选))
字符串:同上
匹配模式:同上
替换的文本:指定替换后的文本
案例:将‘数字 + 斤’全部替换为‘1000斤’
字符串:苹果1500斤,香蕉9万斤,火龙果300斤,橘子6万斤,柿子5万斤
匹配模式:/\d+[万斤]+/g
三、正则表达式函数js源码
//正则表达式匹配函数
//单元格引用函数方法 =RegExpMatch(字符串(必选), 表达式(必选), 索引(可选), 连接符(可选))
function RegExpMatch(text, pattern, index = 0, joint) {
//单元格引用函数的时候,参数可能返回的是单元格,需要从单元格提取值
if (typeof (text) == 'function') text = text.Value2
if (typeof (pattern) == 'function') pattern = pattern.Value2
if (typeof (index) == 'function') index = index.Value2
if (typeof (joint) == 'function') joint = joint.Value2
let i = pattern.lastIndexOf('/') //返回/字符最后的索引
, e = pattern.slice(1, i) //提取表达式
, m = pattern.slice(i + 1) //提取修饰符
, re = new RegExp(e, m) //创建正则对象
if (re.test(text)) {
let mch = text.match(re)
if (joint) return mch.join(joint)
if (index >= mch.length) return '超出索引范围[0, ' + (mch.length - 1) + ']'
return mch[index]
} else {
return '无匹配'
}
}
//正则表达式替换函数
//单元格引用函数方法 =RegExpReplace(字符串(必选), 表达式(必选), 替换的文本(必选))
function RegExpReplace(text, pattern, replaced) {
if (typeof (text) == 'function') text = text.Value2
if (typeof (pattern) == 'function') pattern = pattern.Value2
if (typeof (replaced) == 'function') replaced = replaced.Value2
let i = pattern.lastIndexOf('/') //返回/字符最后的索引
, e = pattern.slice(1, i) //提取表达式
, m = pattern.slice(i + 1) //提取修饰符
, re = RegExp(e, m) //创建正则表达式对象
return text.replace(re, replaced)
}
|