[英]c# regex to match specific text
我想匹配HTML錨中未包含的所有格式為foo:12345的文本。 例如,我想匹配以下第1行和第3行:
foo:123456
<a href="http://www.google.com">foo:123456</a>
foo:123456
我試過這些正則表達式沒有成功:
否定前瞻嘗試(錯誤匹配,但不包括最后一位數)
foo:(\\d+)(?!</a>)
具有非捕獲分組的負前瞻
(?:foo:(\\d+))(?!</a>)
負面的后視嘗試(似乎不支持通配符)
(?<!<a[^>]>)foo:(\\d+)
如果你想開始像這樣分析HTML,那么你可能想要實際解析HTML而不是使用正則表達式。 HTML Agility Pack是通常的第一個停靠點。 使用正則表達式很難處理<a></a>foo:123456<a></a>
類的東西,該東西當然應該拉出中間位,但是編寫正則表達式將非常困難。
我應該補充一點,我假設你實際上有一塊HTML而不是單獨的短字符串,例如你上面的每一行。 在某種程度上,我排除了它是因為匹配它是否是唯一容易的事情,所以我認為如果您願意的話就可以得到它。 :)
正則表達式通常不是工作的最佳工具,但是如果您的案例非常具體,例如您的示例,則可以使用:
foo:((?>\d+))(?!</a>)
你的第一個表達不起作用,因為\\d+
會回溯直到(?!</a>)
匹配。 可以通過不允許\\d+
回溯來解決此問題,如上所述,在atomic / nonbacktracking組的幫助下,也可以在\\d+
回溯的情況下使超前查找失敗,例如:
foo:((?>\d+))(?!</a>|\d)
雖然效率不高。
請注意,lookbehind不適用於內部不同的字符串長度,您可以采用其他方式進行計算
例如
這可能是一個漫長的嘗試,但是您可以簡單地帶回所有foo的出現:一些數字,然后再排除它們。
string pattern = @"foo:\d+ |" +
@"foo:\d+[<]";
然后使用matchcollection
MatchCollection m0 = Regex.Matches(file, pattern, RegexOptions.Singleline);
然后循環每次出現:
foreach (Match m in m0)
{
. . . exclude the matches that contain the "<"
}
我會使用linq並將html視為xml,例如:var query = MyHtml.Descendants()。ToArray(); foreach(查詢中XElement結果){
if (Regex.IsMatch(result.value, @"foo:123456") && result.Name.ToString() != "a")
{
//do something...
}
}
也許有更好的方法,但是我不知道。。。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.