回 帖 发 新 帖 刷新版面

主题:正则表达式的 替换 问题

我有一个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个回复)

沙发

第一个问题很简单。但我不知道什么是“正则”。
但下面一个函数可以解决这个问题:

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

板凳

第二个问题看不懂;
第三个问题更不知道。

3 楼

看明白第二个了!
就是检验一个字符串是否符合那个格式。

4 楼

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 楼

第三个问题,你就自己做算了。

6 楼

谢谢了,哥们儿,结局问题有望了,但现在我用的是VBA开发环境,在你的第二个问题解答中,写入文件好像print不管用

7 楼


谢谢了,哥们儿,结局问题有望了,但现在我用的是VBA开发环境,在你的第二个问题解答中,写入文件好像print不管用,

8 楼

[quote](我的环境用的VB或VBA)[/quote]而且

我的示例代码只不过是说,你可以用来验证你要的东西已经在那个变量里了。
这就是“肉在筷子上”,至于你要放到嘴里,还是扔到垃圾筐里,或者只是端详一下……那都是你的事情。

另外,请给分。

9 楼

用正则的方法:
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 楼

非常感谢你的答案,虽然我的问题已解决,最终是用正则表达式和“老大徒伤悲“的方法综合解决的,主要原因是我的正则表达式只会简单的判断,复杂的就不行了,兄弟你有写正则表达式的工具吗?传我一个我的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

我来回复

您尚未登录,请登录后再回复。点此登录或注册