簡體   English   中英

C#正則表達式以匹配特定文本

[英]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不適用於內部不同的字符串長度,您可以采用其他方式進行計算

例如

  1. 查找並標記錨點中包含的所有foo-s
  2. 與其他人一起尋找並達成目標
  3. 去除痕跡

這可能是一個漫長的嘗試,但是您可以簡單地帶回所有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM