1

括弧を介さずに、括弧内に 2 つの文字列が出現することを識別する VBA の正規表現を特定しようとしています。

たとえば、検索文字列 A はcccで、検索文字列 B はyyyです。

したがって、このターゲット文字列:

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

一致するため、 true を返す必要があります:

(ccc, ddd, yyy)

しかし、このターゲット文字列:

(aaa, xxx (ccc, abc) yyy)

(ccc, yyy)間に右括弧があるため一致しないため、false を返す必要があります。

「not」文字を使用してみました。たとえば、

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

つまり、「2 つの間に左括弧または右括弧が 1 つ以上出現し ない限り、 cccandを含む文字列をください。yyy

ただし、文字列全体を返し続けます。

何か案は?

4

4 に答える 4

2

2つの質問があると思います

  1. 一致するパターン。使った".*?(\(" & strIn1 & "[^\)]+" & strIn2 & "\))"
  2. 一致する部分を返す

重要な部分は、つまり、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では、 VBA 正規表現が貪欲\(.*ccc[^\(\)]*yyy*\)であるため、の最初のインスタンスは.*必要以上に消費します。これは、量指定子を含む正規表現では正常です。*+?

「検索文字列 'foo' と検索文字列 'bar' を含み、部分式を含まない左括弧と右括弧」に一致させたい場合、それを取得する 1 つの方法は次のようになります。

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

この正規表現は、foo と bar が同じ括弧のセット内にあるほとんどのケースをカバーします。ただし、これはテキストと一致しません

(foo, (baz, qux), bar)

あなたがそうすべきだとほのめかしているとしても。その場合に一致する必要がありますか?

遅延量指定子に関する情報については、MSDN のリファレンス ページも参照してください*+?。このための非常に堅牢な正規表現を構築したい場合は、後方参照と後読みアサーションに入る必要があります。

于 2012-07-31T17:32:35.267 に答える