2012-07-30 21 views
1

我試圖在VBA中標識一個正則表達式,它將識別括號內兩個字符串的出現,而不用插入圓括號。如何創建一個正則表達式來標識沒有嵌入字符的兩個字符串

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

所以,這個目標字符串:

(ccc, ddd, yyy)

但這個目標字符串:

(aaa, xxx (ccc, abc) yyy)

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

應該因爲這場比賽對返回true

應該返回false,因爲它沒有與(ccc, yyy)中的匹配,因爲介入的右側paren。

我使用「不」字試過,例如,

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

即說:「給我串cccyyy只要有沒有 1個或多個左括號或在兩者之間。

但是它使返回整個字符串右括號的。

任何想法?

回答

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 
1

對於這個簡單的解決方案:

\(?ccc ?, ?yyy ?\) 
+1

實際上,ccc和yyy之間可能會有干預字符串,所以它不會選擇說它需要做的事情(ccc,ddd,yyy)。 – 2012-07-30 18:44:48

1

這是否你想要做什麼?我不是最好的正則表達式,但我認爲你需要否定兩個括號。順便說一句「*」是零個或多個,所以這裏[^\(^\)]*意味着零個或多個字符,這不是一個左或右括號:

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

在你提出前正則表達式\(.*ccc[^\(\)]*yyy*\).*的第一個實例將消耗超過您想要的數量,因爲VBA regexes are greedy - 對於*+?量詞的正則表達式,這是正常的。

如果要匹配「包含我的搜索字符串'foo'和我的搜索字符串'bar',但不包含子表達式的左括號和右括號,」一種方法可以得到如下:

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

這個正則表達式將覆蓋大多數情況下,foo和bar在同一組圓括號中。但是,這不符合文本

(foo, (baz, qux), bar) 

即使你暗示它應該。你需要它來匹配這種情況嗎?

您也可以查看MSDN參考頁面,瞭解有關惰性*+?量詞的信息,如果您想爲此構建一個非常健壯的正則表達式,則需要進入backreferences and look-behind assertions

相關問題