本篇笔记是第一次尝试采用JS代码为WPS增加表格内容批量处理的功能。我们经常会在办公的时候遇到需要从表格内容中提取指定内容的需求。但是我们发现WPS似乎自身并没有类似的函数帮助我们做批量的文本内容提取。
比如我们有一个表格内容如下:“张三 本人133xxxxxxxx,李四配偶132xxxxxxx,............”如果还有其他的一些内容,或者本人有多个手机号码,我们该如何批量提取呢?
面临从一段内容中提取出我们指定内容的需求,我们最先想到的就是正则表达式。在搜索了一番后发现WPS似乎自身并没用这么一个函数,估计官方可能考虑到正则表达式即使内置了函数,对于办公人员来讲编写正则表达式也很困难,所以就没有做。不管他了,这里波波尝试做了一个。
操作步骤:
1、新建一个Excel表格,点击“开发工具”。
2、点击“WPS宏编辑器”,如上图所示。
3、复制如下代码,粘贴到宏编辑器中,代码如下:
- //正则表达式匹配函数
- function RegExpMatch(text, pattern, index = 0, joint,restr) {
- 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
- if (typeof (restr) == 'function') restr = restr.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 (index >= mch.length) return '超出索引范围[0, ' + (mch.length - 1) + ']'
- if (joint) reslt = mch.join(joint)
- if(restr) reslt = StrReplace(reslt,restr,"")
- return reslt
- } else {
- return '0'
- }
- }
- //正则表达式替换函数
- 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)
- }
- //字符串替换函数
- function StrReplace(str, find, replace) {
- if (str.indexOf(find) === -1) {
- return str;
- }
- return StrReplace(str.replace(find, replace), find, replace);
- }
4、保存为“xlam”文件,在加载项中选择保存的文件。重启WPS,后续WPS每次重启都会自动加载。
使用方法也很简单,比如我们刚刚的需求,需要从一段文本中提取出本人的电话号码,多个号码用斜杠分开。我们就可以在一个空白单元格中输入“=RegExpMatch(B2,"/本人\d{11,}/g",0,"/","本人")”,这样就可以批量把本人的电话号码提取出来了。
B2:代表原始数据所在的单元格;比如需要提取的文本内容放在B列2行。
第二个参数是正则表达式,这里的示例是“/本人\d{11,}/g”正则表达式大家可以根据提取文本的规则自由编写,如不确定自己写的规则是否正确,也可以通过波波工具箱进行测试。网址:https://tools.baiqianwan.net/regex/
第三个参数是索引开始的位置。0表示从B2最左侧第1个字符开始匹配;
第四个参数斜杠就不用说了,如果提取出多个文本时,可以自定义分割符号。
第五个参数至关重要。由于一些文本匹配的特殊性,可能正则匹配后会包含一些字符,如需去除这些字符,可以写在第5个参数上,如果不需要去除,可以留空。
除此之外我们也可以综合利用代码中的三个功能,来实现我们一些复杂的需求。比如我需要同时提取出其他亲朋好友的电话号码放在一个单元格中,我们就可以这么使用:
- =StrReplace(RegExpMatch(Z41,"/(亲戚|姐妹)\d{11,}/g",0,"/","亲戚"),"姐妹","")
怎么样?是不是很方便?需要的小伙伴们可以自己尝试一下哦~~