2011-07-15 69 views
0

正規表現の一致からワイルドカードの値を抽出するのに役立つ必要があります。たとえば:VB.Net正規表現 - ワイルドカード値の抽出

は正規表現:は「私が好き*」

を入力:は「私はチョコレートが好き」

私は正規表現のマッチから「チョコレート」の文字列を抽出できるようにしたいと思います

(または他に何があっても)。可能であれば、1つのワイルドカードの一致から複数のワイルドカード値を取得できるようにしたいと考えています。たとえば、次のように

正規表現:は「私は*遊ぶと*」

入力:「私はギターとベースを弾く」

私は「両方を抽出することができるようにしたいですギター "と"ベース "。それを行う方法はありますか?

答えて

3

一般に、正規表現はグループの概念を利用します。グループは括弧で示します。

ので私は
は私が好きだろう(。
)が好きです。 =

Sub Main() 
    Dim s As String = "I Like hats" 
    Dim rxstr As String = "I Like(.*)" 
    Dim m As Match = Regex.Match(s, rxstr) 
    Console.WriteLine(m.Groups(1)) 

End Sub 

すべての文字*の意味など、多くのまたは先行する文字のいずれもが上記のコードは、のために働くと私のようにしており、「」として含めた後のすべての文字を印刷する文字列ます。空白にも一致します。

最初のrxがより制限的な何かを必要とする文字列の終わりと一致するので、2番目のケースはもっと面白いです。

Iと同様に(\ w +)と(\ + W):これはregexのより完全な治療のためにI Like then a spaceと1つ以上の単語文字と、その後andスペースとone or more word characters

Sub Main() 

    Dim s2 As String = "I Like hats and dogs" 
    Dim rxstr2 As String = "I Like (\w+) and (\w+)" 
    Dim m As Match = Regex.Match(s2, rxstr2) 
    Console.WriteLine("{0} : {1}", m.Groups(1), m.Groups(2)) 
End Sub 

と一致しますが取ります素晴らしいチュートリアルを持っているこのサイトを見てください。

+0

:ここ

Function RegexExtract(ByVal text As String, _ ByVal extract_what As String) As String Application.ScreenUpdating = False Dim allMatches As Object Dim RE As Object Set RE = CreateObject("vbscript.regexp") RE.Pattern = extract_what RE.Global = True Set allMatches = RE.Execute(text) RegexExtract = allMatches.Item(0).submatches.Item(0) Application.ScreenUpdating = True End Function 

は、あなたが一度に複数の部品を抽出するために、複数のグループを使用できるようになりますバージョンです。注意を払うのはワイルドカードの貪欲さだけです。 –

+0

ありがとう、ちなみに、IgnoreCase Regex Optionをオンにした場合、ワイルドカードの値を元の方法で返す方法がありますか?例:「GeRmAnYが好き」は「GeRmAnY」を返します。 – Walker

+0

デフォルトにする必要があります。 – rerun

0

VBAのRegexExtract関数は次のとおりです。指定した部分一致だけが返されます(括弧内のもののみ)。あなたの場合、あなたは次のように書くでしょう:

=RegexExtract(A1, "I like (.*)") 

ここにコードがあります。右側の

Function RegexExtract(ByVal text As String, _ 
         ByVal extract_what As String) As String 

Application.ScreenUpdating = False 
Dim allMatches As Object 
Dim RE As Object 
Set RE = CreateObject("vbscript.regexp") 
Dim i As Long 
Dim result As String 

RE.Pattern = extract_what 
RE.Global = True 
Set allMatches = RE.Execute(text) 

For i = 0 To allMatches.Item(0).submatches.count - 1 
    result = result & allMatches.Item(0).submatches.Item(i) 
Next 

RegexExtract = result 
Application.ScreenUpdating = True 

End Function