2016-08-19 6 views
1

내가하는 나는 다음과 같은 정규식 패턴을 사용하고 Max 70 alphanumeric characters and special characters: '/\\ - ; @ and space을 확인하는 정규식이 -수 없습니다

^[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]; 

처음에는 escape se를 보여주었습니다 이 패턴은 정규식 테스터에 좋은 작품을 할 때 일어나는 무슨 일 이제 메시지 -

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

문제는 대부분 문제가 원인입니다. 직장에서 탈출하는 여러 단계가 있습니다 : 목표 -C, 정규 표현 및 문자 그대로의 사용. 따라서 표현식이 코드에 어떻게 나타나는지 보여주는 것이 중요합니다. – Codo

+0

대쉬를 이스케이프 처리하거나 문자 클래스의 맨 처음 또는 끝에 입력하십시오. – Toto

답변

2

Objective-C에서 정규식 패턴을 작성할 때 특수 문자가있는 백 슬래시를 두 배로 늘려야합니다. 게다가 하이픈을 이스케이프 처리해야합니다 (또는 문자 클래스의 시작/끝에 배치).

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

/을 이스케이프하지 않아도됩니다. regex 엔진은 특수 문자를 이스케이프하고 리터럴 \, Objective-C의 리터럴 백 슬래시를 나타 내기 위해 리터럴 엔진이 리터럴 백 슬래시 ("\\"으로 정의 된 Objective-C 문자열 리터럴)를 사용하므로 리터럴 \을 정의해야합니다. 문자열 리터럴은 두 배가되어야합니다 (리터럴 문자열 패턴 ("\\\\"으로 정의 됨)의 \\)은 입력에서 리터럴 \과 일치합니다. 요점은 문자열 리터럴의 \"\n" (개행) 또는 "\r" (캐리지 리턴) 등과 같은 이스케이프 시퀀스를 형성 할 수 있다는 것입니다. 따라서 두 개의 이스케이프 처리 계층이 있습니다. 하나는 Objective-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

단순히 문자열 리터럴''\ "'은 공간적 의미가 있습니다. 문자열 리터럴에이 문자를 제공하려면' "\\"'을 사용해야합니다. 정규 표현식에서이 문자는 또한 공간적인 의미를 가지므로 단일 슬래시와 일치시키기 위해''\\\\ "'로 끝납니다. –

+0

작은 데모로 몇 가지 설명을 추가했습니다. 대소 문자를 구별하지 않는 변경자'(? i)'가 사용 되었기 때문에'A-Z'를 제거했다는 것에주의하십시오. –