ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2145|回复: 4

[讨论] 为excel新增一个正则表达式函数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-11-26 09:21 | 显示全部楼层 |阅读模式
为excel新增一个正则表达式函数zpy2@excelhome.net
2021-11-26
excel的函数很强大,但是有时候确偏偏缺少一个需要的。正如衣服很多,却总感觉没有可以穿出来的。前两天看到一篇讨论正则表达式的帖子,提到不支持向左预查,所以想到介绍一下运用excel的webservice接口增加一个这样的函数。
excel函数原型
=webservice("http://192.168.1.104:8080/f/?regreplac~(?=张州)区~~玄武区,张州区")
这里有三个参数
1,函数名 regreplace。
2,匹配的正则表达式 (?=张州)区。
3,替换的新字符 这里替换为空白,就是删除 区。
接下来就是实现这个函数了

手机上termux操作
~/.../downloads/htdocs
$ pwd #显示当前目录位置
/data/data/com.termux/files/home/storage/downloads/htdocs
~/.../downloads/htdocs
$ mkdir f #在web根目录新建 一个f 文件夹
2个文件
vim 编辑一下两个文件
<?php
/* 作者:zpy2 @excelhome
* 协议:MIT
* 文件名:./f/index.php
*/
//需要对未编码的特殊情况编码
define("FUNCTIONSDIR",__DIR__.'/');
$_SERVER["QUERY_STRING"]=str_replace("+","%2B",$_SERVER["QUERY_STRING"]);
$_SERVER["QUERY_STRING"]=str_replace("\/","{{slash}}",$_SERVER["QUERY_STRING"]);
//解码
$_SERVER["QUERY_STRING"]=urldecode($_SERVER["QUERY_STRING"]);
if(strpos($_SERVER["QUERY_STRING"],"~")===false){
echo "函数名~参数1~参数2~参数3";
echo "<br>例如<br>";
echo "<ul>";
echo "<li><h3>正则替换api:regreplace/正则表达式/替换为/原字符串</h3>
<p><a href=\"http://club.excelhome.net/forum.php?mod=viewthread&tid=1565723&mobile=\">例如:=webservice(\"http://e.anyoupin.cn/eh3/?regreplace~(\d)(?=[A-Za-z])~$1_~RUSDO W45 ML W118ONIXO W37 HOK A461LIG R473NOLON W90POU W7SAREX W6NLG W509KEVAR\")</a>
<p><a href=\"./?regreplace~(\d)(?=[A-Za-z])~$1_~RUSDO W45 ML W118ONIXO W37 HOK A461LIG R473NOLON\">或浏览器访问</a>

</li>";
die();
}
$arr=explode("~",$_SERVER["QUERY_STRING"]);
array_walk($arr,function(&$value,$key){$value = str_replace("{{slash}}","/",$value);

});


//print_r($arr);die();
$function_name=$arr[0];
/*
这里完成了路由,是因为,解码这里我还是不是很清楚,摸着石头过河,不知道还有没有bug,还有就是为了api少.php?p=之类的输入,所以搞成这样,谁有更好的方法可以告诉我。

*/

require(FUNCTIONSDIR.'f'.$function_name.'.php');




<?php
/* 作者:zpy2 @excelhome
* 协议:MIT
*文件名:./f/fregreplace.php
*/
$patterns="/".$arr[1]."/u";
/*传入字符转义,这个很无语*/
$arr[2]=str_replace(array('\t','\n','\r'),array(chr(9),chr(10),chr(13)),$arr[2]);
$replacements="$arr[2]";
$string=$arr[3];
//print_r($arr);
echo preg_replace($patterns, $replacements, $string);

die();



关于,php环境,windows下,官网下载https://windows.php.net/download#php-8.1
运行命令行
c:/php/htdocs/php -S 0.0.0.0:8080
或者phpstudy

手机端 使用 termux
感觉说了不少,还是感觉没说清楚。如果是直接复制粘贴2个到php运行目录,感觉是不是更直白点。
arr[0];
/*
这里完成了路由,是因为,解码这里我还是不是很清楚,摸着石头过河,不知道还有没有bug,还有就是为了api少.php?p=之类的输入,所以搞成这样,谁有更好的方法可以告诉我。

*/

require(FUNCTIONSDIR.'f'.$function_name.'.php');




<?php
/* 作者:zpy2 @excelhome
* 协议:MIT
*文件名:./f/fregreplace.php
*/
$patterns="/".$arr[1]."/u";
/*传入字符转义,这个很无语*/
$arr[2]=str_replace(array('\t','\n','\r'),array(chr(9),chr(10),chr(13)),$arr[2]);
$replacements="$arr[2]";
$string=$arr[3];
//print_r($arr);
echo preg_replace($patterns, $replacements, $string);

die();



关于,php环境,windows下,官网下载https://windows.php.net/download#php-8.1
运行命令行
c:/php/htdocs/php -S 0.0.0.0:8080
或者phpstudy

手机端 使用 term
収*O_20211113_173358.png
収*O_20211112_080221.png
収*O_20211112_075548.png
収*O_20211110_084743.png
収*O_20211110_082224.png
収*O_20211105_095248.png
収*O_20211031_082109.png
収*O_20211031_081051.png
収*O_20211023_110411.png
収*O_20211023_081733.png
収*O_20211016_114050.png
収*O_20211016_102321.png

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2021-11-26 13:51 | 显示全部楼层
参与一下:
窃以为,“Excel自定义函数,凡是网络版的,对于用户来说,都不够友好。”
为Excel增加一个正则表达式功能的自定义函数,对于弥补Excel对文本处理的功能弱项,确实有必要。

用VBA编写加载宏,可以很容易地为Excel增加自定义函数。但是VBA能直接利用的正则表达式引擎,只有VBScript.RegExp,诚如楼主所言,它不提供"向左预查"的功能(即逆序零宽断言,又称“回顾”,英文为Look behind),也没有命名分组、固化、递归匹配等高级功能。
然而,VBScript.RegExp毕竟拥有的是“正则表达式”的纯正基因,因此,它的功能对于一般EXCEL用户来说,已经足够强大,而且,如果完全调动它的全部能力,是可以突破“向左预查”的局限的,关于这一点,我有一篇主题帖子,做了简单的论述,而且,在竞赛版的一个帖子里,我也总结出了一个可以“突破逆序零宽断言”的“万能公式”。这样一来,VBScript.RegExp引擎,相较于功能最全面的高级引擎,主要也就差了一个“递归匹配”的能力,加上它随手可用的特点,综合起来,还是很不错的选择。

当然,高级正则表达式引擎,也是可以追求的。因为用VSTO开发COM加载宏是很方便的,它可以把.Net中的正则表达式引擎拿来编写自定义函数。如果追求自定义函数的运算效率,可以用C++开发XLL加载宏,或者用EXCEL DNA 在VSTO中用C#或VB.net语言开发XLL加载宏。
总之,不论是VBA还是C++或C#、VB.net,对于会使用编程工具的人来说,把EXCEL自定义函数本地化,都不是难事。而VBA或XLL加载宏,都不需要特殊的权限就可以安装(加载),COM加载宏虽然需要手工注册,也可以提供脚本来一键完成,所以,部署起来的难度也不大。

所以,我倾向于用加载宏(包括COM加载宏、EXCEL的 VBA加载宏或EXCEL XLL加载宏)来添加本地化的自定义函数。除非为了引流之目的,才会像百度那样提供一些网络引擎接口。

评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-29 21:55 来自手机 | 显示全部楼层
编辑多行多列表格
select * from 人员信息机台分配表;create temp table 人员信息机台分配表2 as select 工号,姓名,班组,分配表,split_num(机号范围) 机号范围 from 人员信息机台分配表;cli_split_data~人员信息机台分配表2~,~机号范围;create temp table aa as select row_number() over (partition by 分配表,机号范围 order by 分配表,机号范围) 序,机号范围,班组,'分配表'||分配表 colLabel,printf('%05d',工号)||'|'||姓名 colData from 人员信息机台分配表2split;select * from aa;cli_create_two_dim~aa~colLabel~colData;select * from table_two_dim order by 机号范围,班组;select * from table_two_dim where 班组 like '甲' order by 机号范围

工作表 二维表 行数 多编辑的情况下,实现由编辑记录转换成添加记录一维表记录,然后转换成二维表。
一维表优势,可多人记录,特别是第二张表,方便多指标统计。缺点,需要 记录 班组和分配表1 2列字段。
新增 split_num拆分连续编号为离散变量后,再一行拆分多行。
Screenshot_2021-11-29-21-47-43-223_com.chrome.dev.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-11-30 18:34 来自手机 | 显示全部楼层
zpy2 发表于 2021-11-29 21:55
编辑多行多列表格
select * from 人员信息机台分配表;create temp table 人员信息机台分配表2 as select  ...


cli_split_data~文章导入明细表~<br>~文章内容;create temp table aa as select row_number() over(partition by 文件名) 行,* from 文章导入明细表split;create temp table bb as select 文件名,'r'||行 行,文章内容 from aa where 行 in (2,12,13,14,15,16,17,21);cli_create_two_dim~bb~行~文章内容;select * from table_two_dim;select * from aa where 行

/sql/docxtab/import_docx_zip.php
https://club.excelhome.net/forum.php?mod=viewthread&tid=1608134&fromguid=hot&extra=&mobile=&_dsign=d99e3c64
Screenshot_2021-11-30-18-28-04-523_com.chrome.dev.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-1-10 08:52 来自手机 | 显示全部楼层
zpy2 发表于 2021-11-30 18:34
cli_split_data~文章导入明细表~~文章内容;create temp table aa as select row_number() over(partiti ...

10楼工具入口
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-2 03:56 , Processed in 0.039878 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表