主题:正则表达式的 替换 问题
philiptantan
[专家分:0] 发布于 2008-02-16 19:09:00
我有一个txt文档,内容如下:
C:\LHICT\Miatac\miatac.obc[02-FEB-08 12:59:43
@02-FEB-08 12:59:50 SN C01714B
(O 2751,2755 2759 6587 6591,
(O 2771 2774 6608 6609,6605,
RPWR_P35_GND#(,)VS
RPWR_P35_GND=6.162607K(2K,)AR
RPWR_P35_GND#63.36275U(,)I
R601_44=159.699615(100,175)R
1.提取 C:\LHICT\Miatac[color=FF0000]\[/color]miatac[color=FF0000].obc[/color]中的miatac,即把特征具备最后面的 \ 和 .obc 之间的字符串抓出来,正则表达式如何写(我的环境用的VB或VBA)
2.想提取文档中符合 xxxx[color=FF0000]=[/color]xxxxx[color=FF0000]([/color]xxxxx,xxxxxx[color=FF0000])[/color]xxxx 的所有行,关键字符是=(,),正则表达式如何写(我的环境用的VB或VBA)
3.将符合这两个表达式的内容同时替换并保存可以吗?代码如何,最好告知,我已经耗费了4天的 时间在这3个问题上了。
我是菜鸟,请哪位大侠告知,boyamyxia 希望你能看到这个帖子
回复列表 (共10个回复)
沙发
老大徒伤悲 [专家分:29120] 发布于 2008-02-16 21:35:00
第一个问题很简单。但我不知道什么是“正则”。
但下面一个函数可以解决这个问题:
Private Sub Command1_Click()
Dim Jieguo As String
If Xuanqu("C:\LHICT\Miatac\miatac.obc", "\", ".obc", Jieguo) = 1 Then Print Jieguo
End Sub
Private Function Xuanqu(Yuanzifuchuan As String, Qianbiaozhi As String, Houbiaozhi As String, Jieguo As String) As Integer
Dim Jieshuweizhi As Integer, Kaishiweizhi As Integer
Dim Zizifuchuan As String
Xuanqu = -1
Jieshuweizhi = InStr(1, Yuanzifuchuan, Houbiaozhi) - 1
If Jieshuweizhi = 0 Then
Exit Function
End If
Zizifuchuan = Left(Yuanzifuchuan, Jieshuweizhi)
For i = Jieshuweizhi To 1 Step -1
If Mid(Zizifuchuan, i - Len(Qianbiaozhi) + 1, Len(Qianbiaozhi)) = Qianbiaozhi Then
Kaishiweizhi = i + 1
Xuanqu = 1
Exit For
End If
Next i
If Xuanqu = 1 Then Jieguo = Right(Zizifuchuan, Len(Zizifuchuan) - Kaishiweizhi + 1)
End Function
板凳
老大徒伤悲 [专家分:29120] 发布于 2008-02-16 21:36:00
第二个问题看不懂;
第三个问题更不知道。
3 楼
老大徒伤悲 [专家分:29120] 发布于 2008-02-16 21:38:00
看明白第二个了!
就是检验一个字符串是否符合那个格式。
4 楼
老大徒伤悲 [专家分:29120] 发布于 2008-02-16 22:02:00
Private Sub Command2_Click()
Dim Zifuchuan As String
Open nidewenjian For Input As #1
Do Until EOF(1)
Line Input #1, Zifuchuan
If Fuhegeshi(Zifuchuan, "=(,)") Then Print Zifuchuan
Loop
Close #1
End Sub
Private Function Fuhegeshi(Yuanzifuchuan As String, Geshi As String) As Boolean
Dim Weizhi As Integer
Dim Zifuchuan As String
Fuhegeshi = True
Zifuchuan = Yuanzifuchuan
For i = 1 To Len(Geshi)
Weizhi = InStr(Zifuchuan, Mid(Geshi, i, 1))
If Weizhi = 0 Then
Fuhegeshi = False
Exit Function
End If
Zifuchuan = Right(Zifuchuan, Len(Zifuchuan) - Weizhi)
Next i
End Function
在这里允许格式里四个字符串有几个甚至全部为空字符串。如不想这样,自己修改一下。
5 楼
老大徒伤悲 [专家分:29120] 发布于 2008-02-16 22:04:00
第三个问题,你就自己做算了。
6 楼
philiptantan [专家分:0] 发布于 2008-02-17 21:56:00
谢谢了,哥们儿,结局问题有望了,但现在我用的是VBA开发环境,在你的第二个问题解答中,写入文件好像print不管用
7 楼
philiptantan [专家分:0] 发布于 2008-02-17 21:57:00
谢谢了,哥们儿,结局问题有望了,但现在我用的是VBA开发环境,在你的第二个问题解答中,写入文件好像print不管用,
8 楼
老大徒伤悲 [专家分:29120] 发布于 2008-02-18 11:12:00
[quote](我的环境用的VB或VBA)[/quote]而且
我的示例代码只不过是说,你可以用来验证你要的东西已经在那个变量里了。
这就是“肉在筷子上”,至于你要放到嘴里,还是扔到垃圾筐里,或者只是端详一下……那都是你的事情。
另外,请给分。
9 楼
家人 [专家分:6760] 发布于 2008-02-18 19:12:00
用正则的方法:
Dim re As RegExp
Dim mhs As MatchCollection
Dim mh As Match
Dim p As String
Dim sFile As String
Dim tmp As String
Dim h As Long
'读取文本内容到变量sFile
h = FreeFile
Open App.Path & "\test.txt" For Binary As h
sFile = Space(LOF(h))
Get h, , sFile
Close
'用正则替换miatac为TEST
p = "\\[a-zA-Z0-9]+[.]"
Set re = New RegExp
re.Pattern = p
tmp = Split(sFile, vbCrLf)(0) '只要第一行
tmp = re.Replace(tmp, "\TEST.")
Set re = Nothing
'用正则提取匹配的行
p = "\S+[=]\S+"
Set re = New RegExp
re.Pattern = p
re.Global = True
If re.Test(sFile) Then
Set mhs = re.Execute(sFile)
For Each mh In mhs
tmp = tmp & vbCrLf & mh.Value
Next
End If
'结果
Debug.Print tmp
结果:
C:\LHICT\Miatac\TEST.obc[02-FEB-08 12:59:43
RPWR_P35_GND=6.162607K(2K,)AR
R601_44=159.699615(100,175)R
10 楼
philiptantan [专家分:0] 发布于 2008-02-18 22:07:00
非常感谢你的答案,虽然我的问题已解决,最终是用正则表达式和“老大徒伤悲“的方法综合解决的,主要原因是我的正则表达式只会简单的判断,复杂的就不行了,兄弟你有写正则表达式的工具吗?传我一个我的Email: philip_tanyue@hotmail.com
对了还烦请帮我写一下符合以下条件的正则表达式,我是资质太差,实在写不出
就是把一句话中数字后面,符号前面的字符串分离出来(其实是就是把log文件中的单位找出来)
RPWR_P35_GND=6.162607K(2K,)AR
比如这句话中运行以下代码,想得到答案是 RPWR_P35_GND=6.162607*K(2*K,)AR
R1201_32=993.29725[color=FF0000]K[/color](900[color=FF0000]K[/color],1.213[color=FF0000]MEG[/color])AR
比如这句话中运行,想得到答案是 R1201_32=993.29725*K(900*K,1.213*MEG)AR
换句话就是把“单位”替换成“*单位”
Private Sub CommandButton1_Click()
Dim str As String
str = "R1201_32=993.29725K(900K,1.213MEG)AR"
MsgBox StrReplace(str, "[color=FF0000]????????????[/color]",TestRegExp("[color=FF0000]????????????[/color]","*" & str))
End Sub
Function result(p As String, s As String)
Dim re As RegExp
Dim mh As Match
Dim mhs As MatchCollection
Dim RetStr As String
Set re = New RegExp
re.Pattern = p
re.IgnoreCase = True
re.Global = True
If (re.Test(s) = True) Then
Set mhs = re.Execute(s) ' Execute search.
For Each mh In mhs ' Iterate Matches collection.
RetStr = RetStr & "," & mh.Value
Next
Else
MsgBox "String Matching Failed"
End If
result = RetStr
End Function
Function StrReplace(s As String, p As String, r As String) As String
Dim re As RegExp
Set re = New RegExp
re.IgnoreCase = True
re.Global = True
re.Pattern = p
StrReplace = re.Replace(s, r)
End Function
我来回复