为什么将此正则表达式类更改为。+不提供任何匹配?

时间:2010-07-12 09:02:55

标签: c# .net regex

如果我使用这个

string showPattern = @"return new_lightox\(this\);"">[a-zA-Z0-9(\s),!\?\-:'&%]+</a>";
MatchCollection showMatches = Regex.Matches(pageSource, showPattern);

我得到了一些匹配但是我想摆脱[a-zA-Z0-9(\s),!\?\-:'&%]+并使用任何字符.+ 但如果这样做,我根本就没有匹配。

我做错了什么?

3 个答案:

答案 0 :(得分:3)

默认情况下“。”与新行不匹配,但是类\ s确实如此。

答案 1 :(得分:2)

您正在匹配某个代码,因此您可能需要这些内容,而不是.+

string showPattern = @"return new_lightox\(this\);"">[^<]+</a>";

匹配未命中的原因可能是因为您缺少multiline/singleline flag而结束标记位于下一行。换句话说,这也应该有效:

// SingleLine option changes the dot (.) to match newlines too
MatchCollection showMatches = Regex.Matches(
                              pageSource, 
                              showPattern, 
                              RegexOptions.SingleLine);

答案 2 :(得分:2)

要让.与换行符匹配,请启用SingleLine / DOTALL模式 - 使用函数调用中的标记(如Abel's answer所示)或使用内联修饰符(?s),如这就是整个表达方式:

"(?s)return new_lightox\(this\);"">.+</a>"

或仅针对其中的具体部分:

"return new_lightox\(this\);"">(?s:.+)</a>"


可能更好的是更进一步,并做到这一点:

"return new_lightox\(this\);"">(?s:(?!</?a).+)</a>"

哪会阻止关闭</a>属于其他链接。

然而,你需要非常警惕 - 目前还不清楚你在做什么,但正则表达式好用于解析HTML的工具,可能会导致各种问题。 请使用HTML DOM解析器,例如HtmlAgilityPack