2014-10-06 79 views
2

我試圖學習正則表達式,但仍然沒有線索。我有這行代碼,成功地由「{」分隔符從所有下面的文本的方式隔開佔位符「FirstWord」:正則表達式捕獲多字符分隔符

var regexp = new Regex(@"(?<FirstWord>.*?)\{(?<TextBetweenCurlyBrackets>.*?)\}"); 

讀取此字符串沒有問題:

問候{你好世界}

我想要做的是,以取代「{」一個字符鏈例如像「/ >>」 所以我嘗試這樣的:

var regexp = new Regex(@"(?<FirstWord>.*?)\/>>(?<OtherText>.*?)\"); 

我刪除了最後一個括號,並用'/ >>替換了第一個,但是它引發了一個ArgumentException。正確的字符組合看起來如何?

+1

信不信由你實際上有一個在您的正則表達式的不平衡逃逸'/ >> \ <( *?。?)( *?。?) - 非平衡 '\'' – sln 2014-10-06 20:22:05

回答

2

/不需要進行轉義,除非你把它作爲圖案分隔符:

@"(?<FirstWord>.*?)/>>(?<OtherText>.*?)\" 

而且你最後\基本上會逃脫這應該結束的字符串(C#-wise的":刪除它):

@"(?<FirstWord>.*?)/>>(?<OtherText>.*?)" 

而且因爲你想最有可能獲取直到該字符串的結尾(.*?將獲取根據需求,以滿足表達更少的字符),你應該使用$最後或使用任何其他類型的分隔符(whitspace,linebreak等...)。

@"(?<FirstWord>.*?)/>>(?<OtherText>.*?)$" 

實施例:

(.*?)/>>(.*?)$ 

Regular expression visualization

Debuggex Demo

卸下後$它將取出的第二場比賽組空字符串,因爲""是最短的字符串可能滿足表達式.*?

(.*?)/>>(.*?)$This/>>Test One將匹配ThisTest One

(.*?)/>>(.*?)\sThis/>>Test One將匹配ThisTest

(.*?)/>>(.*?)This/>>Test One將匹配This""

注:我說「 「是最短的可能滿足這個表達。?*故意!經常誤會之處是將.*?a解釋爲「一直到a」:

  • 正則表達式默認爲貪婪!
  • 搜索的「CABA」的expressiong (.*?)a$不匹配 - 它將返回cab,因爲隨後a是滿足表達和cab任何匹配的最短字符串可能cab
  • 人們也可能期望b被匹配 - 但是正則表達式正在從左到右工作,因此一旦發現cab就會中止 - 即使b會更短。
+0

非常感謝你對於解決方案以及在互聯網上有像Debuggex這樣的東西的見解。優秀的答案! – betaFlux 2014-10-06 20:16:47