2011-08-02 15 views
0

RegEx很糟糕,發現這個位在互聯網上的某個位置。它用於匹配Twitter風格的@username,但它有一個小問題 - 它也接受空格作爲單詞。你能修復這個正則表達式嗎?

NSRegularExpression *atRegex = [NSRegularExpression regularExpressionWithPattern:@"(?<!\\w)@([\\w\\._-]+)?" options:NSRegularExpressionCaseInsensitive error:&error]; 

例:「@erik」被正確地匹配,但「@埃裏克」也匹配,並且不應該。

+1

*「我很害怕RegEx」* Isn 't * *那個問題你應該在這裏修復? –

回答

3

你的正則表達式中包含

@(...)? 

?末表示前面的(...)裏面的一切完全是可選的。所以,你的正則表達式不需要匹配@後面的任何內容。

要解決這個問題,你可以刪除()?,留下:

"(?<!\\w)@[\\w\\._-]+" 

不過,你也應該調查什麼(?<!\\w)爲你做的,你是否需要它。

+2

他可能需要它來避免匹配一個電子郵件地址。如果該正則表達式引擎支持可變長度倒序,'(?<!\\ w | ^)'可能會更好。 –

0

@ \ S *

http://regexpal.com/可以在綁定真正幫助

+1

這不會有幫助,因爲你的正則表達式也會匹配@後跟一個空格。 –

+0

這將意味着一個「@」符號,後面跟着零或更多的非空白(空格,製表符和換行符)字符。因此,包含「@」的任何內容都是匹配的。 – aevanko

1

原因@埃裏克匹配是最有可能監守你捕獲組是:

([\\w\\._-]+) 

這意味着一個或多個單詞characteres,句號,下劃線或破折號。所以@ erik匹配sinced「erik」符合這個標準。 lookbehind插入和@符號沒有被包含在比賽組中,但他們應該是因爲他們是比賽的標準。

嘗試asertion你有

(?!<\\w) 

這意味着任何非文字字符,到您的捕獲組相結合的零寬度負回顧後。它不會被包含在匹配中,但會結合在一起表示「在一個非單詞字符和」@「符號後面查找一個或多個單詞字符,句點,下劃線或破折號的字符串。如Tim指出的那樣,這是爲了避免電子郵件比賽

試試這個:

"((?<!\\w)@[\\w\\._-]+)" 

*請注意,我不是一個Objective-C編程,所以我沒有足夠的熟悉它知道,如果你需要寫\ \ w而不是w \ w在正則表達式的風格中,我只習慣使用一個轉義字符,如果上述不起作用,請參考你的文檔

相關問題