我有一个c#代码,一个正则表达式和HTML源文件。它在RegexBuddy和http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx中工作正常,但在Visual Studio中没有。请帮忙解释一下我的错误。
我的期望是:
找到3场比赛:
/setcard/?set=4387740&t=1&secure=xJHC9dYymGSnImebS4qLPw%3D%3D" onclick="return openUrl(this.href);" >Username</a></td> <td bgcolor="#F6F6F6"><a href="../../msg/?id=49244417" onclick="return openUrl(this.href);">Message1 example text</a></td> <td bgcolor="#F6F6F6">16.10.11 23:20</td> has 5 groups:
1. 4387740
2. Username
3. 49244417
4. Message1 example text
5. 16.10.11 23:20
/setcard/?set=4387740&t=1&secure=xJHC9dYymGSnImebS4qLPw%3D%3D" onclick="return openUrl(this.href);" >Username2</a></td> <td><a href="../../msg/?id=49223017" onclick="return openUrl(this.href);">Message2 example text</a></td> <td>16.10.11 14:42</td> has 5 groups:
1. 4387740
2. Username2
3.49223017
4. Message2 example text
5. 16.10.11 14:42
/setcard/?set=4387740&t=1&secure=xJHC9dYymGSnImebS4qLPw%3D%3D" onclick="return openUrl(this.href);" >Username3</a></td> <td bgcolor="#F6F6F6"><a href="../../msg/?id=49222720" onclick="return openUrl(this.href);">Message3 example text</a></td> <td bgcolor="#F6F6F6">16.10.11 14:34</td> has 5 groups:
1. 4387740
2. Username3
3. 49222720
4. Message3 example text
5. 16.10.11 14:34
正则表达式
@"/setcard/\?set=([0-9]*).*;"" >(.*)</a></td>$\s.*/msg/\?id=([0-9]*).*ref\);"">(.*)</a></td>$\s\s?.*>(.*)</td>$"
C#代码
using (StreamReader rdr = File.OpenText("file.html"))
{ s = rdr.ReadToEnd(); }
Regex listMsgs = new Regex(@"/setcard/\?set=([0-9]*).*;"".>(.*)</a></td>$
.*/msg/\?id=([0-9]*).*ref\);"">(.*)</a></td>$
?.*>(.*)</td>$", RegexOptions.Multiline);
Match m = listMsgs.Match(s);
while (m.Success)
{}
HTML来源
<td bgcolor="#F6F6F6" class="c1"><IMG BORDER="0" SRC="transparent.gif" width="15px" height="15px" /></td>
<td bgcolor="#F6F6F6" style="width:108px"><a href="../../auswertung/setcard/?set=4387740&t=1&secure=xJHC9dYymGSnImebS4qLPw%3D%3D" onclick="return openUrl(this.href);" >Username</a></td>
<td bgcolor="#F6F6F6"><a href="../../msg/?id=49244417" onclick="return openUrl(this.href);">Message1 example text</a></td>
<td bgcolor="#F6F6F6">16.10.11 23:20</td>
<td bgcolor="#F6F6F6">
</td>
<td bgcolor="#F6F6F6" align="center">
<img src="message_art1.gif" width="14" height="10" border="0" /> </td>
<td bgcolor="#F6F6F6"><input type="checkbox" name="messages[]" id="id_msg_1" value="49244417"></td>
</tr>
<tr height="20">
<td class="c1"><IMG BORDER="0" SRC="transparent.gif" width="15px" height="15px" /></td>
<td style="width:108px"><a href="../../auswertung/setcard/?set=4387740&t=1&secure=xJHC9dYymGSnImebS4qLPw%3D%3D" onclick="return openUrl(this.href);" >Username2</a></td>
<td><a href="../../msg/?id=49223017" onclick="return openUrl(this.href);">Message2 example text</a></td>
<td>16.10.11 14:42</td>
<td>
</td>
<td align="center">
2 </td>
<td><input type="checkbox" name="messages[]" id="id_msg_2" value="49223017"></td>
</tr>
<tr height="20">
<td bgcolor="#F6F6F6" class="c1"><IMG BORDER="0" SRC="transparent.gif" width="15px" height="15px" /></td>
<td bgcolor="#F6F6F6" style="width:108px"><a href="../../auswertung/setcard/?set=4387740&t=1&secure=xJHC9dYymGSnImebS4qLPw%3D%3D" onclick="return openUrl(this.href);" >Username3</a></td>
<td bgcolor="#F6F6F6"><a href="../../msg/?id=49222720" onclick="return openUrl(this.href);">Message3 example text</a></td>
<td bgcolor="#F6F6F6">16.10.11 14:34</td>
<td bgcolor="#F6F6F6">
</td>
<td bgcolor="#F6F6F6" align="center">
2 </td>
<td bgcolor="#F6F6F6"><input type="checkbox" name="messages[]" id="id_msg_3" value="49222720"></td>
</tr>
<tr height="20">
答案 0 :(得分:1)
这个正则表达式为我产生了预期的结果:
@"/setcard/\?set=([0-9]*).*?;""\s*>(.*?)</a></td>\s*.*?/msg/\?id=([0-9]*).*?ref\);"">(.*?)</a></td>\s*.*>(.*?)</td>"
看起来您正在使用$
元字符来匹配换行符,这是不正确的。这是一个零宽度断言:它在换行之前匹配的位置,而不消耗换行符。这意味着.*
之后的$
必须使用它,但当然点与新行不匹配。
在这种情况下使用锚点($
)确实没有意义;你必须使用换行符,所以只要匹配任何其他字符就可以匹配它们。如果换行符 required ,我建议使用[\r\n]+
,它将匹配任何类型的换行符中的一个或多个,无论它们是\r\n
(DOS / Windows样式), \r
(OSX之前的Mac)或\n
(其他所有内容)。但在这种情况下,我认为你不需要那么具体; \s*
(任何空格字符中的零个或多个)似乎工作正常。您也不再需要Multiline
选项。
答案 1 :(得分:0)
您期望任何类型的换行符,您需要在正则表达式中使用'\ s'。查看a similar question and answer here了解详情。