沙滩星空的博客沙滩星空的博客

Excel使用加载宏自定义正则表达式函数提取复杂字符串文本

Excel本身没有正则表达式函数,这里用 WPS自定义函数的功能来实现。

自定义函数,保存加载宏

查看Excel顶部菜单有没有 开发工具 选项卡。有,则跳过,直接操作第2步,若无,则从第1步开始操作。

  1. 点击 文件 - 选项 - 自定义功能区 - 从下列位置选择命令(C): 选择 主选项卡 - 在方框中选择 工具 - 开发工具 - 点击中间 添加(A)>> 按钮,把左边方框的条目,添加到右边。
  2. 开发工具 - 查看代码 - 粘贴代码 - 保存文件 - 另存为 Excel 加载宏(*.xlam)
//正则表达式匹配函数
//单元格引用函数方法 =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(字符串(必选),匹配模式(必选),索引(可选),连接字符(可选))

# 匹配模式
必选。和js正则表达式语法一样:/模式/修饰符,例全局匹配连续数字/\d+/g
全局匹配title并忽略大小写/title/gi
修饰符: g全局, i忽略大小写, m多行模式, s包括换行符
// 匹配最后一项带大写字母W的数据
RegExpMatch(A2,"/\d{3,4}W(?=[^W]+$)/")
A2单元格字符串:15555555555、13716888157、17766688888、16655、16677788786、18916888689
匹配模式:/(137|189|166)\d{8}/g
案例1:=RegExpMatch(A2,"/(137|189|166)\d{8}/g",0,CHAR(10))
案例2:=RegExpMatch(A2,"/(137|189|166)\d{8}/g",2)
字符串:苹果1500斤,香蕉9万斤,火龙果300斤,橘子6万斤,柿子5万斤
匹配模式:/\d+[万斤]+/g
案例3:=RegExpReplace(A8,"/\d+[万斤]+/g","1000斤")

RegExpReplace函数,替换匹配到的字符

RegExpReplace(字符串(必选),匹配模式(必选),替换的文本(必选))
字符串:苹果1500斤,香蕉9万斤,火龙果300斤,橘子6万斤,柿子5万斤
匹配模式:/\d+[万斤]+/g
案例3:=RegExpReplace(A8,"/\d+[万斤]+/g","1000斤")
未经允许不得转载:沙滩星空的博客 » Excel使用加载宏自定义正则表达式函数提取复杂字符串文本

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址