2017-01-09 126 views
1

我有一個正則表達式模式,似乎需要在它的工作空間,但我不明白爲什麼。這是我製作的一種測試方法,我想匹配兩個'之間的字符,但只有當它被其他字符包圍並且可選空格貫穿始終。爲什麼這個正則表達式需要一個空間?

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'(可能是多個空格)應符合Bar

Foo = ASSIGN/ 'Foo.Bar.Foo.A1-0'應符合Foo.Bar.Foo.A1-0

回答

2

你先正則表達式匹配該空間是因爲滿足逆向條件(該圖案在空間之前被發現)和t他向前看 - (?=([' ]+)?) - 沒有任何區別,因爲它需要一個可選模式,它可能在那裏或不在,因此是完全多餘的。

我想你需要

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

regex demo

詳細

  • (?<=Foo *= *ASSIGN/ *') - 位置必須先與Foo,0 +空格,=,0+空格,ASSIGN/和零個或多個空格
  • [^']+ - 1+字符比'

,如果你需要沒有重疊的比賽,你可以使用捕捉和使用

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

搶第1組其他(match.Groups(1).Value)值。

如果數據可以悄無單引號,你需要的是回顧後後獲得的非1+,空格字符的任何一塊,我建議使用

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

和GRAT的v組內容。見this regex demo

+0

謝謝!這看起來很完美,閱讀起來更清晰!我需要的字符串將始終被單引號包圍,所以第一個選項非常好。 – Notts90

+0

我認爲你可以在這裏沒有看到背後。只需要用[(...)獲取你需要的數據)' –

+0

我需要查看後面的內容來檢查分配的參數,我解析一個編程語言來分配一個特定的參數(在本例中爲'Foo')並獲取分配給參數的字符串(總是被單引號括起來) – Notts90

相關問題