正则表达式查找和替换字符串

时间:2015-07-16 16:07:08

标签: regex excel vba excel-vba

我有几个字符串如下所示:

xml=<data><optional><Account>192</Account></optional></data>, submitter=Q102, target=Q10, escalationType=esc, escalationReason=277, feedback=cx req live esc to have us review, adv cx his account is pending, preventable=0, 

我要做的是在excel(vb)中编写正则表达式以查找feedback=, preventable之间的所有文本,并用PIPE替换其中的所有,

这是我到目前为止找到该文字的表达式:

(?<=feedback=)(.*)(?=, preventable)/gi

但是,我不太确定此时该怎么做才能替换该选择中的文字?

以下是运行后的预期字符串:

 xml=<data><optional><Account>192</Account></optional></data>, submitter=Q102, target=Q10, escalationType=esc, escalationReason=277, feedback=cx req live esc to have us review| adv cx his account is pending, preventable=0, 

以下是我在测试中使用的正则表达式的链接:https://regex101.com/r/wR1dL0/2

1 个答案:

答案 0 :(得分:2)

在regex101中,您选择了PCRE风格,但如果您想使用VBA,则需要选择javascript风格。特别是,后视无效;也不是模式修饰符,在vbscript(javascript)中。

根据您的要求匹配的正则表达式是:

,(?!.*feedback)(?=.*,\s*preventable)

替换字符串只是PIPE

在VBA中实现该功能的UDF可能是:

Option Explicit
Function CommaToPipeBetween(S As String, StartAt As String, EndAt As String) As String
    Dim RE As Object
    Dim sPat As String

sPat = ",(?!.*" & StartAt & ")(?=.*,\s*" & EndAt & ")"

Set RE = CreateObject("vbscript.regexp")
With RE
    .Global = True
    .Pattern = sPat
    .ignorecase = True

    CommaToPipeBetween = .Replace(S, "|")

End With

End Function

UDF假定您不希望在EndAt之前替换逗号,如果它被0个或更多space个字符分隔。但是如果你愿意的话,你可以改变模式以使事情更加通用。