2010-03-07 91 views
2

我從跨度的innerHTML刮一年值和值是在括號中是這樣的:正則表達式:如何逃脫在C#中的「(」元字符

<span class="year_type">(2009)</span><br> 

我想要得到的今年的值,而括號,但我試圖逃離「(」字符時,得到了一些編譯器錯誤

我的模式:

const string yearPattern = "<span class=\"year_type\">\((?<year>.*?)\)</span>"; 

完整代碼:

const string yearPattern = "<span class=\"year_type\">\((?<year>.*?)\)</span>"; 
var regex = new Regex(yearPattern, RegexOptions.Singleline | RegexOptions.IgnoreCase); 
Match match = regex.Match(data); 
return match.Groups["year"].Value; 

什麼是逃避()

感謝

+1

反斜槓爲編譯器轉義字符串文字。爲了逃避它的正則表達式類,你需要另一個。 – Ken 2010-03-07 18:43:36

+0

有一個很棒的免費圖書館,名爲Html Agility Pack。它將避免你的整個問題,讓你的代碼更易於編寫和閱讀,並且不太可能在HTML邊緣案例中突破。 http://www.codeplex.com/htmlagilitypack請不要用正則表達式解析HTML。 http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html – TrueWill 2010-03-07 20:05:56

+0

謝謝TueWill--將它合併了一個小時前,並享受它。 Betters文檔有助於實現目標。使用基本的LINQ,但不能使用lambda表達式? – Chev 2010-03-09 10:59:24

回答

2

使用兩條斜線的最佳途徑。

const string yearPattern = "<span class=\"year_type\">\\((?<year>.*?)\\)</span>"; 

或@文本字符串操作

const string yearPattern = @"<span class=""year_type"">\(?<year>.*?)\)</span>"; 

注;在你原來的正則表達式中,你錯過了一個開放的平庸。

+1

你的文字字符串版本不會編譯。當在一個文字字符串中轉義引號時,你需要使用「」,而不是\「。 – 2010-03-07 18:47:22

+0

得到它,修正dd – Cheeso 2010-03-07 19:02:21

1

準備獲得震撼與一個正則表達式解析HTML ...

話雖這麼說,你只需要@在你的模式定義的前面(或者加倍您逃逸\\)。

const string yearPattern = @"<span class=""year_type"">\(?<year>.*?)\)</span>"; 
+2

這不會編譯當你在字符串中轉義引號時,你需要使用」 」。 – 2010-03-07 18:43:57

+0

如果使用@ -style字符串文字,則不能使用\「嵌入引號。」嘗試@「 \(?。*?)\)」 – 2010-03-07 18:44:39

1

我會考慮使用一個字符類,例如, [(][)],但是使用雙反斜線,例如, \\(\\)(其中一個\用於C#,另一個用於正則表達式)是相當重的語法。所以這是一個品味問題。

相關問題