핸드폰 번호를 판단하여 NSPredicate 술어 논리를 분석하다

9820 단어
NSPredicate와 정규 표현에 관한 코드를 먼저 작성합니다.
//         
+(BOOL) isValidateMobile:(NSString *)mobile
{
    //    13, 15,18 16 17  ,   \d     
    NSString *phoneRegex = @"^((13[0-9])|(15[^4,\\D])|(16[0-9])|(17[0-9])|(18[0,0-9]))\\d{8}$";
    NSPredicate *phoneTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",phoneRegex];
    return [phoneTest evaluateWithObject:mobile];
    
}

이것은 휴대전화 번호의 진위를 판단하고 다시 한 번 은행 카드 번호를 판단하는 데 쓰인다.
//  16-19      
+ (BOOL)judgeBankCardNumber:(NSString*)str
{
    //16 19   6        
//    NSString * pattern = @"";
//    NSRegularExpression * reglx = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil];
//    NSArray * array = [reglx]
    NSString * cardNumRegex = @"^[6]\\d{3}\\s*\\d{4}\\s*\\d{4}\\s*\\d{4}$|^[6]\\d{3}\\s*\\d{4}\\s*\\d{4}\\s*\\d{4}\\s*\\d{1,3}$";
    NSPredicate *numTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",cardNumRegex];
    return [numTest evaluateWithObject:str];
    
}
     ,     NSPredicate,        。      ,   NSPredicate。

iOS Predicate      。     SQL       ,               。

NSArray 는 주로 두 가지 방법으로 활용됩니다.
- (NSArray *)filteredArrayUsingPredicate:(NSPredicate *)predicate;

NSMutableArray
- (void)filterUsingPredicate:(NSPredicate *)predicate;

또한 NSSet과 NSMutableSet도 이 클래스로 필터링할 수 있습니다.
필터 사용 구성원 실례 방법을 이용하여 길이가 3보다 큰 문자열을 필터합니다
NSArray *array = @[@"jim", @"cook", @"jobs", @"sdevm"];
NSPredicate *pre = [NSPredicate predicateWithFormat:@"length > 3"];
NSLog(@"%@", [array filteredArrayUsingPredicate:pre]);

프린트
( cook, jobs, sdevm)

lenght는 그룹 구성원에 대해 [xxxx lenght]를 실행한 다음 되돌아오는 NSUInteger 값이 3보다 큰지 판단하는 것입니다.NSString으로 확장하는 다른 방법(예: integerValue 등)
NSArray *array = @[@"2", @"3", @"4", @"5"];
NSPredicate *pre = [NSPredicate predicateWithFormat:@"integerValue >= %@", @3];
NSLog(@"%@", [array filteredArrayUsingPredicate:pre]);

만약 내가 어떤 실례적인 방법을 쓰고 싶지 않다면, 멤버 자체를 뽑으려면 어떻게 해야 하는가.이럴 때는 self로 대신할 수 있어요.
NSPredicate *pre = [NSPredicate predicateWithFormat:@"self CONTAINS %@", @3];

CONTAINS 사용법은 다음에 설명합니다.
모델로 확장
Test.h

@interface Test : NSObject

@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSNumber *code;

@end

Test *test1 = [[Test alloc]init];
test1.name = @"  ";
test1.code = @1;

Test *test2 = [[Test alloc]init];
test2.name = @"    ";
test2.code = @2;

Test *test3 = [[Test alloc]init];
test3.name = @"   ";
test3.code = @3;

NSArray *array = @[test1, test2, test3];
NSPredicate *pre = [NSPredicate predicateWithFormat:@"code >= %@", @2];
NSLog(@"%@", [array filteredArrayUsingPredicate:pre]);

그룹 구성원 [test code] 방법 (code 속성의 get 방법) 반환값 >=2의 구성원을 선별합니다.여기서 비교 연산자는 =,!=, <=,
사실==NSNumber 객체를 비교하는 데 사용될 뿐만 아니라 NSString 객체가 동일한지 판단하는 데도 사용될 수 있다.
NSPredicate *pre = [NSPredicate predicateWithFormat:@"name == %@", @"  "];

name이 '서호' 의 대상 그룹을 선별합니다.

NSString 객체에 대한 작업


앞에서 언급한 == 비교 연산자는 - (BOOL)isEqual ToString: (NSString*)aString을 일으킬 수 있다.문자열이 같은지 아닌지를 판단하는 방법의 효과입니다.그렇다면 문자열에 포함된 문자열은 어떻게 판단해야 하는가. NSPredicate에서는 포함 관계를 CONTAINS(대소문자 모두 가능)로 나타낼 수 있다.
NSPredicate *pre = [NSPredicate predicateWithFormat:@"name CONTAINS %@", @" "];

판단할 때 대소문자를 무시해야 합니다. [cd]
[c] 대소문자 무시
[d] 중음 기호 무시 [cd]는 대소문자도 구분하지 않고 발음 기호도 구분하지 않습니다.사용:
NSPredicate *pre = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@", @"abc"];

문자열이 어떤 문자열로 시작하거나 끝날 때, 어댑터의 사용을 판단하는 등 더 복잡한 검색 문구도 관련된다.
BEGINSWITH(이미 문자열 시작, begins with)
NSString *targetString = @"h"; NSPredicate *pre = [NSPredicate predicateWithFormat:@"name BEGINSWITH %@",targetString];

ENDSWITH(이미 문자열 끝, ends with)
NSString *targetString = @"ing"; NSPredicate *pre = [NSPredicate predicateWithFormat:@"name ENDSWITH %@",targetString];

와일드카드 LIKE
* 하나 이상의 공백을 나타냅니다.
?문자
Test *test1 = [[Test alloc]init];
test1.name = @"absr";
test1.code = @1;

Test *test2 = [[Test alloc]init];
test2.name = @"asb";
test2.code = @2;

Test *test3 = [[Test alloc]init];
test3.name = @"raskj";
test3.code = @3;

NSArray *array = @[test1, test2, test3];

NSPredicate *pre = [NSPredicate predicateWithFormat:@"name LIKE %@", @"?b*"];
NSLog(@"%@", [array filteredArrayUsingPredicate:pre]);

결과는test1만 일치하고like도 받아들일 수 있음[cd]
NSPredicate *pre = [NSPredicate predicateWithFormat:@"name LIKE[cd] %@", @"?b*"];

IN, BETWEEN, AND, OR, NOT 등의 관계 연산
IN(중)
NSPredicate *pre = [NSPredicate predicateWithFormat:@"code IN %@", @[@1, @3]];

코드가 @1 또는 @2인지, 즉 그룹에 있는지 판단합니다.
OR(또는 ||로 대체) OR는 IN을 대체하여 같은 효과를 얻을 수 있지만 OR는 더욱 유연하다.
NSPredicate *pre = [NSPredicate predicateWithFormat:@"code == %@ OR code == %@ ", @1, @3];

효과는 IN과 같지만 OR는 하나의 속성만 판단할 수 있다
NSPredicate *pred = [NSPredicate predicateWithFormat:@"code == %@ OR name == %@ ", @1, @"asb"];

BETWEEN(사이)
일반적으로 NSNumber 객체를 판단하는 데 사용됩니다.
NSPredicate *pred = [NSPredicate predicateWithFormat:@"code BETWEEN {1, 3}"];

코드의 >=1 여부를 판단하고 <=3 AND(또한, &&&로 대체할 수 있음)
NSPredicate *pred = [NSPredicate predicateWithFormat:@"code >= %@ AND code <=%@", @1, @3];

NOT
NOT에서 가장 흔히 볼 수 있는 용법은 한 수조에서 다른 수조의 데이터를 제거하는 것이다. 약간 빙빙 돌 수도 있고, 예를 들면 매우 명랑하다.
NSArray *arrayFilter = @[@"abc1", @"abc2"];
NSArray *arrayContent = @[@"a1", @"abc1", @"abc4", @"abc2"];
NSPredicate *thePredicate = [NSPredicate predicateWithFormat:@"NOT (SELF in %@)", arrayFilter];
NSLog(@"%@",[arrayContent filteredArrayUsingPredicate:thePredicate]);

인쇄(a1, abc4)
순환 비교를 새로운 수조에 추가하는 것보다 간단한 것이 한두 가지가 아니다.앞에서 언급한 것은 모두 +(NSPredicate*)predicateWithFormat: (NSString)predicateFormat,....방법 창설, 또 다른 상용 방법: + (NSPredicate) predicate With Block: (BOOL (^) (id evaluated Object, NSDictionary *bindings) Block, Block 형식으로 창설
NSPredicate *pre = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
    Test *test = (Test *)evaluatedObject;
    if (test.code.integerValue > 2) {
        return YES;
    }
    else{
        return NO;
    }
}];

매개 변수 evaluatedObject는 그룹 구성원을 표시하고 Block은 YES나 NO로 돌아가 각각 일치하는지 일치하지 않는지 표시해야 합니다.bindings 파라미터를 무시해 주십시오. 구체적인 작용은 저도 잘 모르겠습니다.
다중 선별
여러 개의 속성에 일치하는 선별이 필요하다면 AND나 OR로 연결하는 것은 분명히 번거롭다. NSCompoundPredicate류는 우리의 요구를 충족시킬 수 있다. 이것은 여러 개의 NSPredicate 대상을 조합할 수 있고 조합 방식은 AND나 OR일 수 있다.
NSPredicate *pre1 = [NSPredicate predicateWithFormat:@"code >= %@", @3];
NSPredicate *pre2 = [NSPredicate predicateWithFormat:@"code <= %@", @2];

// AND    
NSPredicate *pre = [NSCompoundPredicate andPredicateWithSubpredicates:@[pre1,pre2]];
// OR    
NSPredicate *pre = [NSCompoundPredicate orPredicateWithSubpredicates:@[pre1, pre2]];

일치 사용법
사실 NSPredicate는 선별뿐만 아니라 일치가 직접 되돌아오는지 여부를 판단하는 데도 사용된다. 주요한 방법은 - (BOOL)evaluateWithObject: (id)object,사용법:
Test *test1 = [[Test alloc]init];
test1.name = @"absr";
test1.code = @1;

NSPredicate *pres = [NSPredicate predicateWithFormat:@"code == %@", @2];
BOOL match = [pres evaluateWithObject:test1];

물론 가장 자주 사용하는 것은 정규 표현식에 맞추어 몇 가지 자주 사용하는 정규를 열거하는 것이다.
처음에 언급한 두 가지 용법처럼 하나의 예이다
a로 시작하고 e로 끝낼지 여부
NSString *string=@"assdbfe";
NSString *targetString=@"^a.+e$";
NSPredicate *pres = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", targetString];
BOOL match = [pres evaluateWithObject:string];

메일박스인지 여부
NSString *strRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{1,5}";

휴대폰 번호
NSString *strRegex = @"[0-9]{1,20}";

구덩이
+(NSPredicate*)predicateWithFormat:(NSString*)predicateFormat를 이용하면....메서드가 생성한 NSPredicate 객체에 구멍이 있습니다.
어떤 경우, 상기 예와 유사한 코드 문자열이 명확하지 않아서, 만들 때 이렇게 사용한다
Test *test1 = [[Test alloc]init];
test1.name = @"absr";
test1.code = @1;

Test *test2 = [[Test alloc]init];
test2.name = @"asb";
test2.code = @2;

Test *test3 = [[Test alloc]init];
test3.name = @"raskj";
test3.code = @3;

NSArray *array = @[test1, test2, test3];

NSPredicate *pre = [NSPredicate predicateWithFormat:@"%@ == %@", @"code", @2];
NSLog(@"%@", [array filteredArrayUsingPredicate:pre]);

NSPredicate 객체가 초기화되는 방법에 유의하십시오.이 코드를 실행하면test2 대상이 조회되지 않은 것을 발견할 수 있습니다.프린트pre에서 '코드' ==2를 발견하면 '코드' 방법의 되돌아오는 값을 찾을 수 있습니다. 이것은 분명히 통하지 않습니다.
만약 검색한 것이 속성이라면, 예를 들어 코드가 Test 클래스의 속성이라면, 아래의 생성 방식을 이용하십시오
NSPredicate *pre = [NSPredicate predicateWithFormat:@"%K == %@", @"code", @2];

주의하지 않을 것입니다:% K의 K는 대문자여야 합니다.
마지막으로 NSPredicate는 거의 모든 형식의 조회를 만족시킬 수 있으며,CoreData의 데이터베이스 조회에 협조하는 것은 물론이다.NSPredicate의 용법은 이것뿐만이 아니다. 관심 있는 친구들은 nshipster 사이트의 이 블로그를 보면 내가 언급하지 않은 용법을 언급할 수 있다.

좋은 웹페이지 즐겨찾기