|
本帖最后由 仙女配凡人 于 2023-4-15 18:39 编辑
不管是 MS Office 还是 WPS Excel 目前都没有正则表达式功能,对于复杂的文本嵌套多层公式非常麻烦,好在WPS支持 JavaScript 语言自定义函数,我们只需要封装好函数,就可以在单元格用公式使用正则表达式了,本篇介绍在 WPS 中用 JS 封装自定义函数,等 MS Office 啥时候支持 JavaScript 语言再出一篇
通过WPS宏编辑器自定义RegExpMatch、RegExpReplace两个函数,把代码保存为xlam文件添加到加载项(xlam文件可理解为没有工作表的工作簿),就能自动跟随Excel启动,并且在所有工作簿都能使用。
- //单元格引用正则表达式方法 =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)
- }
复制代码
函数说明
一、RegExpMatch函数,提取匹配到的字符
RegExpMatch(字符串(必选), 匹配模式(必选), 索引(可选), 连接字符(可选))
参数名称 | 可选/必选 | 数据类型 | 说明 | 字符串 | 必选 | 文本 | 要处理的文本,可引用单元格 | 匹配模式 | 必选 | 文本 | 跟 JavaScript 正则表达式语法一样:/匹配模式/修饰符,例如全局匹配类型数字:/\d+/g
全局匹配并忽略大小写title:/title/gi
其中修饰符g表示全局、i忽略大小写、m多行模式、s包括换行符 | 索引 | 可选 | 数字 | 返回匹配到的第几项,注意索引都是从0开始 | 连接字符 | 可选 | 文本 | 指定字符,拼接所有匹配到的项 |
匹配最后一项3-4位数字带大写字母W的数据:
数据在A列,B列单元格输入公式:=RegExpMatch(A2,"/\d{3,4}W(?=[^W]+$)/")
匹配下面的JSON字符串,把所有匹配到的项用 | 字符拼接起来:
数据在A列,匹配模式在B列,则在C列输入公式:=RegExpMatch(A1,A2,0,"|")
{"code": 0,"medias":[{"title":"那年廿八,还是单身,站着如喽啰","index":2},{"title":"首尔街头美女遍地走体验驻韩美军的快乐","index":9},{"title":"春日和我约会吧!5套日常LOOK分享","index":17},{"title":"「su_ll」白桃乌龙茶艺妆,你女朋友没那么小气吧","index":25}]} | /(?<=title":").*?(?=",)/g | =RegExpMatch(A1,A2,0,"|") |
二、RegExpReplace函数,替换匹配到的字符
RegExpReplace(字符串(必选), 匹配模式(必选), 替换的文本(必选))
例如在重命名工作表的时候,工作表名称开头与结尾不得是单引号,并且不得含有字符:: \ / ? * [ ]
数据在A列,将特殊字符全部替换为 - ,则B列输入公式:=RegExpMatch(A1,"/^'|'$|[\\/?*\[\]]/g","-")
行号 | 工作表名称 | 输入公式 | 返回结果 | 1 | 95 [周一].xlsx | =RegExpMatch(A1,"/^'|'$|[\\/?*\[\]]/g","-") | 95 -周-一.xlsx | 2 | 周*雨.xlsx | =RegExpMatch(A2,"/^'|'$|[\\/?*\[\]]/g","-") | 周-雨.xlsx | 3 | '=100/50.xlsx | =RegExpMatch(A3,"/^'|'$|[\\/?*\[\]]/g","-") | -=100-50.xlsx |
|
评分
-
4
查看全部评分
-
|