2017-01-09 9 views
1

私は動作するためにスペースが必要と思われる正規表現のパターンを持っていますが、なぜその理由が分かりません。ここでは私が作ったテスト方法を紹介しますが、それは2つの文字の間の文字を一致させたいのですが、それは他の文字とオプションのスペースで囲まれている場合のみです。なぜこの正規表現にスペースが必要なのですか?

Private Sub RegexTestSub() 

    Dim testString = "Foo = ASSIGN/ 'Bar'" 

    Dim patternA = "(?<=Foo([ ]+)?=([ ]+)?ASSIGN\/([ ']+)?)[a-zA-Z0-9-_. ]+(?=([' ]+)?)" 
    Dim patternB = "(?<=Foo([ ]+)?=([ ]+)?ASSIGN\/ ([ ']+)?)[a-zA-Z0-9-_. ]+(?=([' ]+)?)" 

    Dim resultA As Match = Regex.Match(testString, patternA) 
    Dim resultB As Match = Regex.Match(testString, patternB) 

End Sub 

どちらの試合が、resultB.Valueは「バー」に等しいが、resultA.Valueは単なるスペースです。正規表現のパターンの唯一の違いは、ASSIGN\/(私が知っている!)の後のスペースです。私はこのスペースをオプションにしたいと思っていました。これは([ ']+)?が達成すると思ったものです。一致している必要があり

他の例...

Foo=ASSIGN/'Bar'Bar

Foo = ASSIGN/'Bar'と一致する必要がありますが(複数のスペースだろう)Foo.Bar.Foo.A1-0

答えて

2

あなた最初の正規表現の一致を一致させる必要がありBar

Foo = ASSIGN/ 'Foo.Bar.Foo.A1-0'と一致する必要があります見た目の条件が満たされている(そのパターンはスペースの直前にある)ので、スペースは彼は先読みする - (?=([' ]+)?) - それは任意のパターンを必要とするので何の違いもありません。それはそこにあるかもしれないし、そうでないかもしれないので、全く冗長です。場所は0+、Fooとスペース、=を付ける必要があり、0+ -

  • (?<=Foo *= *ASSIGN/ *')

    は、私はあなたがregex demo

    詳細を参照してください

    (?<=Foo *= *ASSIGN/ *')[^']+ 
    

    必要があると思いますスペース、ASSIGN/、ゼロ以上のスペース

  • [^']+ - 1+あなたが重なり一致を必要としない場合、あなたはをキャプチャを使用して

    Foo *= *ASSIGN/ *'([^']+) 
    

    を使用し、グループ1(match.Groups(1).Valueを)つかむことが'

以外の文字注値。

データを単一引用符ずに来ることができる、そしてあなたがその後読みの後1+非空白文字の任意のチャンクを取得する必要がある場合、私は

Foo *= *ASSIGN/ *(?:'(?<v>[^']+)'|(?<v>\S+)) 

を使用することをお勧めしてvグループの内容をGRAT。 this regex demoを参照してください。

+0

ありがとうございます!これは完全に機能しているようで、読むのがはっきりしています!私が必要とする文字列は、常に単一引用符で囲まれるので、最初のオプションは素晴らしいです。 – Notts90

+0

私はあなたがここで見て回らなくてもできると思います。ちょうどあなたが必要とするデータをキャプチャ '(...) ' –

+0

私は特定のパラメータ(この場合は' Foo')を代入するためのプログラミング言語を解析し、そのパラメータに割り当てられた文字列を取得する(常に単一引用符で囲まれている) ) – Notts90

関連する問題