如果我使用这个
string showPattern = @"return new_lightox\(this\);"">[a-zA-Z0-9(\s),!\?\-:'&%]+</a>";
MatchCollection showMatches = Regex.Matches(pageSource, showPattern);
我得到了一些匹配但是我想摆脱[a-zA-Z0-9(\s),!\?\-:'&%]+
并使用任何字符.+
但如果这样做,我根本就没有匹配。
我做错了什么?
答案 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。