设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 2074|回复: 6
打印 上一主题 下一主题

[模块/函数] 请教一个比较复杂的正则表达式问题

[复制链接]
跳转到指定楼层
1#
发表于 2013-1-26 20:07:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 todaynew 于 2013-1-26 20:09 编辑

我在写一个程序,为了简化输入需要写一个与正则表达式有关的函数,我希望输入一个字符串,这个字符串中包含形如:sum(v(1,1):v(3,3))的子字符串。
如何用一个自定义函数将这个子字符串替换为形如:
(v(1,1)+v(1,2)+v(1,3)+v(2,1)+v(2,2)+v(2,3)+v(3,1)+v(3,2)+v(3,3))
的子字符串,并返回替换后的字符串。由于对正则表达式不太熟悉,望帮忙写一个自定义函数。谢谢!!!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅

点击这里给我发消息

2#
发表于 2013-1-27 10:49:24 | 只看该作者
这个东西用正则表达式实现只怕不容易,我想原因出现在循环上,也许能够实现,平常只做过简单的替换,呵呵
值得研究。

先匹配出 v(1,1):v(3,3),然后从子匹配获取v,1,1,3,3,生成循环上限和下限,再生成
v(1,1)+v(1,2)+v(1,3)+v(2,1)+v(2,2)+v(2,3)+v(3,1)+v(3,2)+v(3,3)
然后再做替换,不知道行不行,没测试,呵呵
3#
发表于 2013-1-27 11:41:01 | 只看该作者
试下这个:
  1. Function Mytest(str As String) As Boolean
  2. Dim reg As New RegExp
  3. reg.Pattern = "v\([1 -3],[1-3]\)"
  4. Mytest = reg.test(str)
  5. End Function
复制代码
上面的代码匹配:v(1,1)~v(3,3)。循环部分需要老汉根据实际来写了。
4#
 楼主| 发表于 2013-1-27 12:52:34 | 只看该作者
本帖最后由 todaynew 于 2013-1-27 12:54 编辑
zhuyiwen 发表于 2013-1-27 10:49
这个东西用正则表达式实现只怕不容易,我想原因出现在循环上,也许能够实现,平常只做过简单的替换,呵呵
...

朱老师:
问题是这样的:有如下的一些表示公式的字符串:
“round(sum(v(1,2):v(2,4)/5,2)”
"iif(sum(v(2,2):v(4,4))=0,0,1/sum(v(2,2):v(4,4)))"
这类字符串中包含了形如:sum(v(数字1,数字2):v(数字3,数字4))的子字符串。要将这个子字符串替换成加和关系的子字符串。
解决的思路是:
1、判断是否存在sum(v(数字1,数字2):v(数字3,数字4))子字符串;
2、存在的情况下,判断存在几个sum(v(数字1,数字2):v(数字3,数字4))子字符串,即得到循环替换的count值;
3、做循环逐一获取sum(v(数字1,数字2):v(数字3,数字4))子字符串,以及sum(v(数字1,数字2):v(数字3,数字4))子字符串所在位置的左环视子字符串和右环视子字符串;
4、对sum(v(数字1,数字2):v(数字3,数字4))再通过正则表达式分别得到:数字1~数字4(这一步不用正则表达式处理也问题不大,可以通过字符串函数来处理)
5、通过数字1~数字4做两层循环得到要替换的字符串。
6、将得到的替换的子字符串与左环视字符串、右环视字符串拼接为需要的字符串。

我现在遇到的主要问题在于取出sum(v(数字1,数字2):v(数字3,数字4))子字符串和它所在位置的左、右环视子字符串,是否能就此问题给点提示。如果能写一个完整的函数最好。谢谢。


5#
 楼主| 发表于 2013-1-27 13:10:52 | 只看该作者
roych 发表于 2013-1-27 11:41
试下这个:上面的代码匹配:v(1,1)~v(3,3)。循环部分需要老汉根据实际来写了。

有一些字符串,大体可以用以下正则表达式表示(不知道写的对不对):
^(\w*\bsum\(v\(\d*,d*\):v\(\d*,\d*\)\)\b\w*)*$
如何得到\bsum\(v\(\d*,d*\):v\(\d*,\d*\)\)\b以及前后的字符串?
6#
发表于 2013-1-27 13:11:35 | 只看该作者
todaynew 发表于 2013-1-27 12:52
朱老师:
问题是这样的:有如下的一些表示公式的字符串:
“round(sum(v(1,2):v(2,4)/5,2)”

如果是咋Excel里的话,应该比较好整,用单元格或者数组或者内置函数都很方便。
第一步可以用正则表达式来完成。涉及到小括号需要【冒号不需要】用到转义字符来写正则表达式。前面已经写了个例子了,这里就不再写了,修改下Pattern属性就好了:
sum\(v\([1 -3],[1-3]\):v\([1 -3],[1-3]\)\)
后面嘛~~不太清楚,俺是来打酱油滴。^_^
7#
 楼主| 发表于 2013-1-27 13:59:51 | 只看该作者
roych 发表于 2013-1-27 13:11
如果是咋Excel里的话,应该比较好整,用单元格或者数组或者内置函数都很方便。
第一步可以用正则表达式来 ...

设一个字符串变量为str,如何将sum\(v\([1 -3],[1-3]\):v\([1 -3],[1-3]\)\)搜索到的这个字符串赋值给str呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-11-25 07:31 , Processed in 0.094741 second(s), 30 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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