1

我试图在 VBA 中识别一个正则表达式,它将识别括号内两个字符串的出现,没有插入括号。

例如,搜索字符串 A 是ccc,搜索字符串 B 是yyy

所以,这个目标字符串:

(aaa, xxx (ccc,ddd, yyy) abc)

由于以下匹配,应该返回 true:

(ccc, ddd, yyy)

但是这个目标字符串:

(aaa, xxx (ccc, abc) yyy)

(ccc, yyy)应该返回 false ,因为由于中间的右括号它没有匹配。

我试过使用“非”字符,例如,

\(.*ccc[^\(\)]*yyy*\)

这就是说“只要在两者之间 没有ccc出现 1 次或多次左括号或右括号,就给我带有and的字符串。yyy

但是它一直返回整个字符串。

有任何想法吗?

4

4 回答 4

2

我想你有两个问题

  1. 要匹配的模式。我用了".*?(\(" & strIn1 & "[^\)]+" & strIn2 & "\))"
  2. 返回匹配的部分

关键部分是,即在第二个字符串之前的任何地方
"[^\)]+"
都不能有右括号

Function ValidateText(strIn1 As String, strIn2 As String, strTarget As String) As String
Dim objRegex As Object
Dim bMatch As Boolean
Set objRegex = CreateObject("vbscript.regexp")
With objRegex
s = ".*?\(.*(" & strIn1 & "[^\)]+" & strIn2 & ".*\))"
.Pattern = ".*?\(.*(" & strIn1 & "[^\)]+" & strIn2 & ").*\)"
bMatch = .TEst(strTarget)
If bMatch Then
ValidateText = "this portion matched " & vbNewLine & .Replace(strTarget, "$1") & vbNewLine & "for " & strIn1 & " " & strIn2
Else
ValidateText = "no match for " & vbNewLine & .Replace(strTarget, "$1") & vbNewLine & "for " & strIn1 & " " & strIn2
End If
End With
End Function

Sub Test1()
MsgBox ValidateText("ccc", "yyy", "(aaa, xxx (ccc,ddd, yyy) abc)")
MsgBox ValidateText("ccc", "yyy", "(aaa, xxx (ccc, abc) yyy)")
End Sub
于 2012-07-31T06:25:24.997 回答
1

对此的简单解决方案:

\( ?ccc ?, ?yyy ?\)
于 2012-07-30T17:28:20.497 回答
1

这是做你想做的吗?我不是最好的正则表达式,但我认为你需要否定两个括号。顺便说一句,“*”是零个或多个,所以这里[^\(^\)]*的意思是零个或多个不是左括号或右括号的字符:

\(.*ccc[^\(^\)]*yyy.*\)
于 2012-07-31T00:00:53.273 回答
1

在您提出的 regex\(.*ccc[^\(\)]*yyy*\)中,第一个实例的.*消耗量将超过您的预期,因为VBA 正则表达式是贪婪的- 这对于带有*+?量词的正则表达式来说是正常的。

如果要匹配“包含我的搜索字符串 'foo' 和我的搜索字符串 'bar',但不包含子表达式的左括号和右括号”,一种获取方法如下:

\([^\)]*foo[^\)]*bar[^\)]*\)

此正则表达式将涵盖 foo 和 bar 在同一组括号中的大多数情况。但是,这与文本不匹配

(foo, (baz, qux), bar)

即使你暗示它应该。你需要它来匹配那个案例吗?

您可能还想查看 MSDN 参考页面以获取有关惰性*+?量词的信息,如果您想为此构建一个真正强大的正则表达式,您将需要了解反向引用和后向断言

于 2012-07-31T17:32:35.267 回答