Office中国论坛/Access中国论坛

标题: 请教一个比较复杂的正则表达式问题 [打印本页]

作者: todaynew    时间: 2013-1-26 20:07
标题: 请教一个比较复杂的正则表达式问题
本帖最后由 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))
的子字符串,并返回替换后的字符串。由于对正则表达式不太熟悉,望帮忙写一个自定义函数。谢谢!!!
作者: zhuyiwen    时间: 2013-1-27 10:49
这个东西用正则表达式实现只怕不容易,我想原因出现在循环上,也许能够实现,平常只做过简单的替换,呵呵
值得研究。

先匹配出 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)
然后再做替换,不知道行不行,没测试,呵呵
作者: roych    时间: 2013-1-27 11:41
试下这个:
  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)。循环部分需要老汉根据实际来写了。
作者: todaynew    时间: 2013-1-27 12:52
本帖最后由 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))子字符串和它所在位置的左、右环视子字符串,是否能就此问题给点提示。如果能写一个完整的函数最好。谢谢。



作者: todaynew    时间: 2013-1-27 13:10
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以及前后的字符串?
作者: roych    时间: 2013-1-27 13:11
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]\)\)
后面嘛~~不太清楚,俺是来打酱油滴。^_^
作者: todaynew    时间: 2013-1-27 13:59
roych 发表于 2013-1-27 13:11
如果是咋Excel里的话,应该比较好整,用单元格或者数组或者内置函数都很方便。
第一步可以用正则表达式来 ...

设一个字符串变量为str,如何将sum\(v\([1 -3],[1-3]\):v\([1 -3],[1-3]\)\)搜索到的这个字符串赋值给str呢?




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3