2016-08-19 44 views
1

我有一個正則表達式來檢查Max 70 alphanumeric characters and special characters: '/\\ - ; @ and space爲此我使用下面的正則表達式模式 -無法在Objective C創建正則表達式

^[a-zA-Z0-9,.-\s'\\\/@]{0,70}$ 

請注意:在https://regex101.com作品完美的罰款測試此

而下面的代碼與字符串匹配它 -

NSString *String = [email protected]\\ 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^[a-zA-Z0-9,.-\s'\\\/@]{0,70}$" options:NSRegularExpressionCaseInsensitive error:&error]; 

NSAssert(regex, @"Unable to create regular expression"); 
NSRange textRange = NSMakeRange(0, string.length); 
NSRange matchRange = [regex rangeOfFirstMatchInString:string options:NSMatchingReportProgress range:textRange]; 

最初人們展示自身逃脫與MESSAGE-

Assertion failure in +[UMValidations validateString:withPattern:] 
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Unable to create regular expression 

現在^[a-zA-Z0-9,.-\\s'\\\\//@]{0,70}$

而現在它導致崩潰時,這種模式適用於正則表達式測試儀大錯在哪發生的事情 - quence錯誤,我改變了格局。

+0

請提供字符串文字與您所使用的正則表達式。 –

+0

這個問題最有可能是由於反黑。在工作中有幾個級別的轉義:Objective-C,正則表達式和文字使用。因此,顯示錶達式如何在代碼中出現是很重要的。 – Codo

+0

只是逃離破折號或將它放在字符類的開頭或結尾。 – Toto

回答

2

當你寫在Objective-C正則表達式模式,用特殊字符的反斜槓必須加倍。此外,您還需要跳過連字符(或將其放在字符類的開始/結尾處)。

@"^[a-zA-Z0-9,.\\-\\s'\\\\/@]{0,70}$" 
       ^^ ^^ ^^^^ 

您不需要轉義/。您需要使用4個反斜線來定義文字\因爲正則表達式引擎使用反斜槓(定義爲"\\"一個Objective-C字符串字面)轉義特殊字符,表示文字\,在Objective-C中的反斜槓字符串文字必須加倍(\\),這是一個文字字符串模式(因此,定義爲"\\\\")將與輸入中的文字\相匹配)。主要的一點是,該串中的文字\可以形成一個轉義序列等"\n"(換行)或"\r"(回車)等,所以,有逸出的兩層:一個用於目標C發動機,另 - 對於正則表達式(在這種情況下是ICU)庫。

Objective-C demo

NSString *String = @"[email protected]\\"; 
NSRegularExpression *regex = @"(?i)^[a-z0-9,.\\-\\s'\\\\/@]{0,70}$"; 
NSPredicate * Test = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex]; 
if ([Test evaluateWithObject:String]) { 
    NSLog (@"yes"); 
} else { 
    NSLog (@"no"); 
} 
+0

你能否解釋一下這個機制 - 你需要使用4個反斜槓來定義一個文字\。謝謝 –

+0

簡單地用C字符串''「\」'具有空間意義。要在字符串中提供這個字符,你必須使用'「\\」'。在正則表達式中,這個角色也具有空間意義,所以你最終只用'\\\\''來匹配單斜槓。 –

+0

我用一個小演示添加了更多解釋。請注意,我僅僅因爲使用了不區分大小寫的修飾符'(?i)'而刪除了'A-Z'。 –