2010-03-07 81 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#,另一个用于正则表达式)是相当重的语法。所以这是一个品味问题。

相关问题