| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 504 人关注过本帖
标题:求正则表达式语句,提取两个单词之间的内容
只看楼主 加入收藏
William1949
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:111
专家分:0
注 册:2009-3-17
结帖率:63.64%
收藏
已结贴  问题点数:20 回复次数:8 
求正则表达式语句,提取两个单词之间的内容
例如:
Begin ABC Begin 这里是我要提取的内容 End BBB End;

红色字体是我提取的内容,即:提取“Begin”...“End”之间的部分?
关键问题是“Begin”...“End”的前面还有嵌套,对我有些难度,希望大家帮我,谢谢!!!
搜索更多相关主题的帖子: 表达式 
2013-01-15 11:04
bczgvip
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:66
帖 子:1310
专家分:5312
注 册:2009-2-26
收藏
得分:5 
先写个小例子,怎样?
收到的鲜花
  • William19492013-01-16 13:38 送鲜花  3朵   附言:谢谢帮助
2013-01-15 14:18
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:5 
Begin ABC Begin 这里是我要提取的内容 End BBB End;

我不会用正则。

1、先用 split 按空格分解掉。
2、遍类整个数组。
3、发现 begin 时, 记录 下标。如果已存在下标,那么用新的下标覆盖它。
4、发现 end 时,如果保存了下标,记录 下标。退出循环
5、把这二个下标差之间的元素用空格连接起来了。


s="Begin ABC Begin 这里是我要提取的内容 End BBB End;"
s2() =split(s," ")
w1=-1
w2=-1
for i=0 to ubound(s2)
  if ucase(s2(i))="BEGIN" then
     w1=i
  elseif ucase(s2(i)="END" then
     if w1>-1 then
        w2=i
        exit for
     end if
  end if
next i
s3=""
for i=w1+1 to w2-1
  s3=s3 & " " & s2(i)
next i
  s3=mid(s3,2)
-------------
s3 就是所需要的值

=============
手工代码,未经测试。
收到的鲜花
  • William19492013-01-16 13:38 送鲜花  3朵   附言:谢谢帮助

授人于鱼,不如授人于渔
早已停用QQ了
2013-01-15 16:18
William1949
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:111
专家分:0
注 册:2009-3-17
收藏
得分:0 
谢谢版主
我知道用其它方法也可以解决。比如用“InStr”函数,或者用您提供的方法。
但我更希望用正则表达式(有点不死心,哈哈),因为正则的代码比较简单。
但是在VB6中用正则,它好像不能识别嵌套的情况,它总是把第一次出现“Begin”到第一次出现“End”之间的内容提取出来,
即,“Begin ABC Begin 这里是我要提取的内容 End”这显然不是我要的结果。
我就是想问一下大家,在VB6中用正则,如何解决嵌套的问题?
2013-01-16 09:25
bruly
Rank: 1
等 级:新手上路
帖 子:7
专家分:5
注 册:2013-1-7
收藏
得分:5 
回复 4楼 William1949
要使用正则,这个好办,问题是:
   您要匹配的内容,是否唯一,还是有多个,如您所示:“Begin ABC End”
请问:Begin与End的出现频率如何?
    如果您发要匹配的整个内容帖出来,我应该能帮助到您。
收到的鲜花
  • William19492013-01-16 13:37 送鲜花  3朵   附言:谢谢帮助
2013-01-16 10:37
William1949
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:111
专家分:0
注 册:2009-3-17
收藏
得分:0 
朋友你好:
就以三楼的帖子为例:把“Begin”换成“then”;把“End”换成“End If”;即匹配 then ... ...End if 之间的内容;
... ...
if ucase(s2(i)="END" then
     if w1>-1 then
        w2=i
        exit for
     end if
  end if
... ...
这段代码有两层的then嵌套,而我需要匹配最内层的then。
我要是用: RegExp.Pattern = "then[\s\S]+?end if",显然是错误的,它出现的结果是:
程序代码:
then
     if w1>-1 then
        w2=i
        exit for
     end if

或者可以换一种问法:例如:
STR = "15*(3+(5*(15+28)))"
在上面的子串中,我要匹配最里层的那一个括号,即:(15+28),该怎么做?

说明一点,用其它方法也可以达到目的,我只是觉得用正则有时很方便,代码简单。只不过在VB6中用正则处理嵌套的情况时有一些缺憾,不知道有没有办法可以改善。谢谢



[ 本帖最后由 William1949 于 2013-1-16 11:40 编辑 ]
2013-01-16 11:39
lowxiong
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:27
帖 子:653
专家分:3402
注 册:2008-5-7
收藏
得分:5 
我也不懂正则表达式,不过以前处理过四则混合运算时涉及到括号的处理,大概和这个差不多,要用到函数嵌套,处理效果见下图
图片附件: 游客没有浏览图片的权限,请 登录注册

'代码如下,没有检测语句对是否个数一样
程序代码:
Function regular(s As String) As String
  Const Head = "Begin"
  Const Tail = "End"
  Dim l As Integer, r As Integer, a As String
  If s <> "" Then
    l = InStrRev(s, Head) '找到最后一个Begin的位置
    r = InStr(s, Tail)  '找到第一个End的位置
    If l=0 Or r=0 Then Exit Function  '避免Begin、End不成对造成嵌套进入死循环或执行错误
    Text2 = Text2 & Mid$(s, l + Len(Head), r - l - Len(Head)) & "  "
    s = Replace(s, Mid$(s, l, r + Len(Tail) - l), "")
    regular s  '自己调用自己,嵌套处理,直到字符串为空跳出嵌套
  End If
End Function

Private Sub Command1_Click()
  Dim s As String
  Text2 = ""
  s = Text1
  regular s
End Sub

Private Sub Form_Load()
  Text1 = ""
  Text2 = ""
End Sub


[ 本帖最后由 lowxiong 于 2013-1-16 12:38 编辑 ]
收到的鲜花
  • William19492013-01-16 13:37 送鲜花  3朵   附言:谢谢帮助
2013-01-16 12:16
William1949
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:111
专家分:0
注 册:2009-3-17
收藏
得分:0 
谢谢7楼的朋友
跟我的想法差不多,我也是用“InStr”函数来做,能达到预期的结果;
只不过我在学习正则表达式的时候,有一段说明:如下:
... ...
例如,你可能要搜索一个 HTML 文档来查找一处包含在 H1 标记中的章节标题。在文档中该文字可能具有如下形式:
<H1>Chapter 1 – Introduction to Regular Expressions</H1>
下面的表达式匹配从开始的小于号 (<) 到 H1 之后的(>)之间的所有内容。
"<.*?>"
... ...
我在想如果<>之间出现嵌套的情况时,该怎么办,还能用正则吗?例如:
<H1<ABC>H1>Chapter 1 – Introduction to Regular Expressions</H1>

是:VB6的正则表达式 能力有限,达不到我的要求?
还是:我不得其法,不会使用正则?
希望在这方面精通的朋友 指点!!!

[ 本帖最后由 William1949 于 2013-1-16 13:28 编辑 ]
2013-01-16 13:14
lowxiong
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:27
帖 子:653
专家分:3402
注 册:2008-5-7
收藏
得分:0 
只要有规律,没什么不可以的。即使没有规律,处理起来无非代码多点而已。只要想的到,程序就能做的到!
收到的鲜花
  • William19492013-01-16 13:39 送鲜花  3朵   附言:谢谢帮助
2013-01-16 13:33
快速回复:求正则表达式语句,提取两个单词之间的内容
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.054966 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved