![](/img/trans.png)
[英]Regex pattern not working on my C# code however it works on an online tester
[英]Multiline regex- works in RegexBuddy and online tester, but doesn't work in c#
我有一個ac#代碼,一個正則表達式和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">
這個正則表達式為我產生了預期的結果:
@"/setcard/\?set=([0-9]*).*?;""\s*>(.*?)</a></td>\s*.*?/msg/\?id=([0-9]*).*?ref\);"">(.*?)</a></td>\s*.*>(.*?)</td>"
看來您正在使用$
元字符來匹配換行符,這是不正確的。 這是一個零寬度的斷言:它與換行符之前的位置匹配,而不會消耗換行符。 這意味着$
后面的.*
必須使用它,但是當然點與換行符不匹配。
在這種情況下,使用錨點( $
)確實沒有意義; 無論如何,您都必須使用換行符,因此只需按照匹配其他任何字符的方式進行匹配即可。 如果需要換行符,我建議使用[\\r\\n]+
,它將匹配任何一種或多種換行符,無論它們是\\r\\n
(DOS / Windows風格), \\r
(OSX之前的版本) Mac)或\\n
(其他所有字符)。 但是在這種情況下,我認為您不需要這么具體; \\s*
(零個或多個空格字符)似乎可以正常工作。 您也不再需要“ Multiline
選項。
在任何需要換行符的地方,都需要在正則表達式中使用“ \\ s”。 請查看類似的問題,然后在此處回答以獲取更多詳細信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.