簡體   English   中英

正則表達式vs字符串包含

[英]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.

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