2016-10-30 6 views
1

を使用たとえば抽出括弧データIは、文字列と文字列に隣接するセルに格納するから(括弧を含む)括弧データを抽出小さなサブ有する正規表現

Sub parens() 
    Dim s As String, i As Long 
    Dim c As Collection 
    Set c = New Collection 

    s = ActiveCell.Value 
    ary = Split(s, ")") 
    For i = LBound(ary) To UBound(ary) - 1 
     bry = Split(ary(i), "(") 
     c.Add "(" & bry(1) & ")" 
    Next i 

    For i = 1 To c.Count 
     ActiveCell.Offset(0, i).NumberFormat = "@" 
     ActiveCell.Offset(0, i).Value = c.Item(i) 
    Next i 

End Sub 

を:

enter image description here

これをいくつかのRegexコードに置き換えようとしています。私は正規表現の専門家ではない。私は開いたかっこの後に任意の型の0個以上の文字が続いて閉じ括弧が続くパターンを作成したいと思います。 私が思いついた:

\((.+?)\) 

私の現在の新しいコードは次のとおりです。

Sub qwerty2() 

    Dim inpt As String, outpt As String 
    Dim MColl As MatchCollection, temp2 As String 
    Dim regex As RegExp, L As Long 

    inpt = ActiveCell.Value 
    MsgBox inpt 
    Set regex = New RegExp 
    regex.Pattern = "\((.+?)\)" 
    Set MColl = regex.Execute(inpt) 
    MsgBox MColl.Count 
    temp2 = MColl(0).Value 
    MsgBox temp2 

End Sub 

コードは、少なくとも2つの問題があります。

  • をそれだけで文字列の最初の試合を取得します。 (Mcoll.Countは常に1)
  • 括弧の間にゼロ文字は認識されません。 (私はを考える。+?は、少なくとも一つの文字が必要です)

誰もが何か提案を持っています?デフォルトでは

答えて

1

、正規表現グローバルプロパティがFalseのです。 Trueに設定する必要があります。

正規表現は、できるだけゼロ個以上の文字と一致させるには、+?ではなく、*?が必要です。両方ともであり、遅延が(有効な一致を見つけるために必要な数だけ一致します)ですが、+は少なくとも1つのcharを必要とし、*は一致するゼロ文字(空の文字列)を許可します。

したがって、正規表現については

Set regex = New RegExp 
regex.Global = True 
regex.Pattern = "\((.*?)\)" 

を使用し、あなたも[^()]は、任意の文字に一致する否定文字クラスですが()、ゼロ個以上の

regex.Pattern = "\(([^()]*)\)" 

を使用することができます(数字は*であるため)、できるだけ多くのそのような文字に一致します(*は欲張りの量子です)。

+0

ありがとう...............これらを試してみます............... –

+1

もう一度おねがいします! .....................完璧! **説明にも感謝します!** –

関連する問題