我有几个字符串如下所示:
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
答案 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
个字符分隔。但是如果你愿意的话,你可以改变模式以使事情更加通用。