2011-11-14 83 views
2

我試圖建立一個非常具體的編輯器與語法突出顯示。 我用正則表達式做了所有簡單的東西,這很簡單,但現在我想用正則表達式添加一些高級功能。Regex積極的前瞻與反向引用

在這種情況下,我想知道是否在任何JumpTo命令上使用了定義的標籤。
例子:

Define1,Command,Command 
Define2,Command,Command,JumpTo4 
Define3,Command,Command,JumpTo1 
Define4,Command,Command 

的目標在這裏是要找到每一個定義(Definexxx)由一個JumpTo(一個或多個)引用可能它是前或後定義。 在另一個步驟中,我還想找到任何Define未被任何JumpTo引用。

我試圖表述 「定義(?<標籤> \ d +)(?= JumpTo \ķ<標籤>)」 爲正預測先行。我希望它會找到「Define1」,但它沒有(沒有或沒有多行選項)。

這是可能的一步完成正則表達式,或者我應該放棄這個想法,只考慮兩步法?

回答

7

你快到了,只是忘了.*。我已經添加了一個向後斷言當前的前還要檢查定義:

Regex regexObj = new Regex(
    @"Define(?<tag>\d+\b)  # Match Define<number> 
    (?:       # Match either... 
    (?=.*JumpTo\k<tag>\b)  # if JumpTo<number> occurs somewhere ahead 
    |       # or... 
    (?<=JumpTo\k<tag>\b.*)  # if JumpTo<number> occurs somewhere before 
    )       # End of alternation", 
    RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace); 

我添加\b字邊界錨,以確保我們總是匹配整個號碼(如果我們達到Define10這得到重要以上)。

此外,請注意使用Singleline選項。這是你想要的,而不是Multiline它指的是如何與^$匹配。

+0

不應該「定義(? \ d + \ b)」而不是「定義(? \ d +)\ b」? 在第一個表達式中,「\ b」將包含在中,以便「(?=。* JumpTo \ k \ b)」實際上與「跳轉 \ b \ b」匹配......我是對的? – Suriv

+0

@Suriv,'\ b'是一個零寬度斷言;無論是在組內還是外部都無關緊要,因爲它不會消耗任何字符。我認爲它看起來更整潔。 –