본문 바로가기

Mac&iOS

정규식으로 텍스트필드에 영문, 한글, 숫자, 특수문자만 입력 받기(2)

이전 포스팅 : 정규식으로 텍스트필드에 영문, 한글, 숫자, 특수문자만 입력 받기(1)



이제 값을 체크할 차례이다.


텍스트필드의 입력된 값을 가리키는 포인터는 partialStringPtr이다. 여기 값을 체크해서 return NO를 해주면 텍스트필드에 값이 입력되지 않는다. 


간단하게  [*partialStringPtr length] > 10 인지 체크해서 return NO만 해주어도 글자가 10자 까지만 입력되게 할 수 있다.


좀더 복잡한 처리를 위해 정규식을 사용할 예정이다. 


Objective C에서는 정규식을 사용할때 NSRegularExpression 를 사용하면 된다. 


영문이나 숫자만 최대 100자만 입력가능하게 하려면 다음과 같이 하면 된다. 


 // 영문, 숫자 10자


NSString *expression = @"^[a-zA-Z0-9//s]{0,10}$";


NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:expression options:NSRegularExpressionCaseInsensitive error:nil];


NSUInteger numberOfMatches = [regex numberOfMatchesInString:*partialStringPtr options:0 range:NSMakeRange(0, [*partialStringPtr length])];


if (numberOfMatches == 0) {return NO;}



그럼 한글은 어떻게 허용할까? 가-힣 와 같은 형태를 사용하면 된다. 


 // 한글, 숫자 10자


NSString *expression = @"^[가-힣0-9//s]{0,10}$";


NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:expression options:NSRegularExpressionCaseInsensitive error:nil];


NSUInteger numberOfMatches = [regex numberOfMatchesInString:*partialStringPtr options:0 range:NSMakeRange(0, [*partialStringPtr length])];


if (numberOfMatches == 0) {return NO;}



그럼 특수문자는 어떻게 허용할까. 특수문자는 직접 하나씩 입력해서 넣을 수 있다. 단 정규식에 사용하는 특수문자는 \를 붙여줘야 한다. 

Objective C에서는 \를 문자열에 넣기 위해서는 \\와 같은 형태로 입력해야 한다. 최종적인 형태는 다음과 같다.


 // 한글, 영문, 숫자, 특수문자 100자


NSString *expression = @"^[a-zA-Z0-9가-힣 `~!@#$%^&*()\\-_=+\\[{\\]}\\\\|;:'\",<.>/?//s]{0,100}$";


NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:expression options:NSRegularExpressionCaseInsensitive error:nil];


NSUInteger numberOfMatches = [regex numberOfMatchesInString:*partialStringPtr options:0 range:NSMakeRange(0, [*partialStringPtr length])];


if (numberOfMatches == 0) {return NO;}



추가내용.

자. 이렇게하면 문제가 없을까?

자음만 입력하거나 모음만 입력할 경우 문제가 있었다. 자음 단독으로 입력하고 마우스를 다른 Textfield를 클릭할 경우 Crash 문제가 생긴다. 


자음만 오는 경우를 막으면 안될까?


한글은 조합해서 입력해야 하므로 자음 단독으로 입력할 경우 Textfield로 TextChange 이벤트가 오지 않는다. 즉  (void)controlTextDidChange:(NSNotification *)notification 이벤트를 받아서 처리가 불가능하다.


어쩔 수 없이 자음과 모음 단독 사용을 허용해주거나 우선 입력을 받게 하고 스트링을 고쳐주는 방식으로 처리해야겠다. 우선 자음과 모음을 허용하는 정규식은 다음과 같다. 


NSString *expression = @"^[ㄱ-ㅎㅏ-ㅣ가-힣0-9//s]{0,10}$";


ㄱ부터 ㅎ까지, ㅏ부터ㅣ까지 를 추가했다.


이제 더이상 Crash는 나오지 않는다.