2014-06-24 42 views
1

我想匹配類似於Lookup("lookup name", "lookup key") 的字符串,所以我可以替換「查找鍵」。不太貪心.NET正則表達式

我有如下模式:查找鍵爲「3」或3:

[lL][oO][oO][kK][uU][pP]\(.*?,[ ]*("3"|3)\)

但是當我用它在接下來的輸入字符串(已嵌套調用),它的整個匹配除最後一個括號外的字符串。

LOOKUP("lookup name1",LOOKUP("lookup name2",3))

我如何得到它只是比賽的最後一部分LOOKUP("lookup name2",3)

+2

' 「......嵌套了......」'BZZZZZ 。立即停止使用正則表達式。正則表達式不是有狀態的,因此不能用於像這樣的語法。看到這個:[可以使用正則表達式來匹配嵌套模式嗎?](http://stackoverflow.com/questions/133601/can-regular-expressions-be-used-to-match-nested-patterns) –

+0

例子' LOOKUP(「lookup name1」,LOOKUP(「lookup name2」,3))很簡單,不需要理解嵌套結構。你還可以有'LOOKUP(LOOKUP(「lookup name1」,「lookup name2」),3)'?因爲那個更具挑戰性。 – Kobi

+0

@JonathonReinhart,是的,我知道。 – camios

回答

4

直接匹配和更換密鑰

這是你查找鍵直接匹配!

(?i)(?<=lookup\([^(),]*,)[^()]*?(?=\)) 

參見demo

你可以接着用任何你喜歡的替換:

resultString = Regex.Replace(yourString, @"(?i)(?<=lookup\([^(),]*,)[^()]*?(?=\))", "whatever"); 

這工作,因爲.NET正則表達式引擎支持無限lookbehinds。

說明

  • (?i)使我們在不區分大小寫模式
  • (?<=lookup\([^(),]*,)是斷言什麼之前我們是字面lookup(,則未括號或逗號任何字符的回顧後,再一個逗號
  • 字符類[^()]*?懶惰地匹配任何不是括號的字符(這是我們的匹配!)
  • 先行(?=\)斷言,接下來是一個右括號

參考

+0

謝謝,很高興它的工作! :) – zx81

+0

嘿btw我注意到你還沒有投票在堆棧。你知道該怎麼做嗎?您單擊問題左側複選標記上方的向上箭頭。如果這個答案有幫助,並且對於所有你認爲有幫助的答案,請考慮投票,因爲這是代表系統在這裏的工作原理。:)當然沒有義務。謝謝!!! – zx81