[英]Regex vs String.Contains
你好。 我無法編寫一種方法來測試純文本或html文檔中的單詞。 我對regex相當了解,並且對c#較新(從更多的java來)。
只是因為
string html = source.ToLower();
string plaintext = Regex.Replace(html, @"<(.|\n)*?>", " "); // remove tags
plaintext = Regex.Replace(plaintext, @"\s+", " "); // remove excess white space
接着,
string tag = "c++";
bool foundAsRegex = Regex.IsMatch(plaintext,@"\b" + Regex.Escape(tag) + @"\b");
bool foundAsContains = plaintext.Contains(tag);
對於應該找到“ c ++”的情況,有時foundAsRegex為true,有時為false。 我的google-fu很弱,所以我對“到底是什么”的了解不多。 任何想法或指針歡迎!
編輯:
我正在尋找簡歷技能方面的比賽。 例如,不同的值“ c ++”。
編輯:
真實的摘錄如下:
“ ...管理-c,c ++,perl,shell編程...”
問題是\\b
在單詞字符和非單詞字符之間匹配。 給定表達式\\bc\\+\\+\\b
,您有問題。 “ +”是非單詞字符。 因此,在“ xxx c ++,xxx”中搜索模式,您將不會找到任何東西。 “ +”字符后沒有“分詞”。
如果您要查找非單詞字符,則必須更改邏輯。 不知道最好的東西是什么。 我想您可以使用\\W
,但是它不會在行的開頭或結尾匹配,因此您需要(^|\\W)
和(\\W|$)
...這很丑。 並且緩慢,盡管根據您的需求也許仍然足夠快。
您的正則表達式將變為:
/\bc\+\+\b/
這意味着您要查找一個單詞邊界,然后是字符串c++
,然后是另一個單詞邊界。 這意味着它將與abc++
類的字符串不匹配,而plaintext.Contains
將成功。
如果您可以舉例說明您的正則表達式在您期望成功的地方失敗,那么我們可以為您提供更明確的答案。
編輯:我原來的正則表達式是/\\bc++\\b/
,這是不正確的,因為將c++
傳遞給Regex.Escape()
,它轉義了正則表達式元字符,例如+
。 我已經在上面修復了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.