iOS 개발 - 정규 표현 식 사용 과 일치 하 는 내용

8576 단어
저 희 는 한 사용자 의 조작 데이터 가 합 법 적 인지 검증 하 는 경우 가 많 습 니 다. 가장 좋 은 방법 은 사용자 의 행위 조작 이 정확 한 지 를 정규 로 검사 하 는 것 입 니 다.
사진 하나 찍 고 편 하 게 할 까요?
정규 일치 정수 와 부동 소수점
  :        ,     ,            :         
     3.2GB,      788MB,   6.7GB  ,    12GB.
              
3.2GB 
788MB
6.7GB
12GB

우리 가 만약 에 첫눈 에 당신 이 어떻게 해 야 한다 고 생각 합 니까? 우리 가 오늘 원 하 는 것 은 일치 할 뿐만 아니 라 해당 하 는 수 치 를 얻 는 것 입 니 다. 이것 은 우리 가 사용 하 는 시스템 NSRegularExpression 과 일치 하고 내용 의 일치 도 해 야 합 니 다. 처음에 나 는 세 가지 규칙 을 생각 했 습 니 다. 다음 과 같 습 니 다.
  • \\d*\\.\\d*[M|G]B 이런 규칙 은 소수점 이 함 유 된 수치 에 만 적합 하 다. 프로젝트 에서 사용 할 때 정수 가 일치 하지 않 는 것 을 발견 하고 아래
  • 를 계속 수정 한다.
  • (((\\d*\\.\\d*)MB)|((\\d*\\.\\d*)GB)) 이것 은 PHP 의 큰 소 가 쓴 것 입 니 다. 제 가 자세히 분 해 했 는데 제 가 쓴 것 만 있 으 면 되 는 것 같 지만 정수 에 맞 으 면 틀 립 니 다.
  • (\\d*(\\.\\d*)?)[M|G]B 이것 이 야 말로 우리 가 원 하 는 것 이다. 소수 와 일치 할 수 있 고 정수 와 일치 할 수 있다. 이것 은 내 가 고려 한 후에 약간 수정 한 것 이다. 검 측 결 과 는 정상 적 인 것 이다
  • 세 번 째 상황 의 일치 코드 인 스 턴 스 는 다음 과 같 습 니 다.
        NSString *searchText = @"            3.2GB,       899MB,      5.8GB,      12GB";
        NSError *error = NULL;
        //@"\\d*\\.\\d*[M|G]B"                  
        //@"(((\\d*\\.\\d*)MB)|((\\d*\\.\\d*)GB))"          
        NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(\\d*(\\.\\d*)?)[M|G]B" 
        options:NSRegularExpressionCaseInsensitive error:&error];
        NSTextCheckingResult *result = [regex firstMatchInString:searchText options:0 range:NSMakeRange(0, [searchText length])];
        NSArray * matches1 = [regex matchesInString:searchText options:NSMatchingReportProgress range:NSMakeRange(0, [searchText length])];
        for (NSTextCheckingResult * test in matches1) {
           
            NSString *tagValuestr = [searchText substringWithRange:test.range];
             NSLog(@"tagvalue = %@",tagValuestr);
        }
        if (result) {
            NSLog(@"%@", [searchText substringWithRange:result.range]);
        }
    
    

    콘 솔 출력 결 과 는 다음 과 같 습 니 다.
    2016-03-15 17:41:19.608 RegularExp[54814:2551313] tagvalue = 3.2GB
    2016-03-15 17:41:19.608 RegularExp[54814:2551313] tagvalue = 899MB
    2016-03-15 17:41:19.608 RegularExp[54814:2551313] tagvalue = 5.8GB
    2016-03-15 17:41:19.608 RegularExp[54814:2551313] tagvalue = 12GB
    2016-03-15 17:41:19.609 RegularExp[54814:2551313] 3.2GB
    
    

    이것 이 바로 우리 가 원 하 는 결과 result 가 하나의 결과 이 고 사용 matches 은 여러 가지 결 과 를 얻 는 것 임 을 알 수 있다.
    URL 매개 변 수 를 가 져 오 는 정규 사항 을 다시 한 번 말씀 드 리 겠 습 니 다.
    코드 는 다음 과 같 습 니 다:
     NSError *error1;
        NSString *regTags=[[NSString alloc] initWithFormat:@"(^|&|\\?)+%@=+([^&]*)(&|$)",@"adc"];
        NSRegularExpression *regex1 = [NSRegularExpression regularExpressionWithPattern:regTags
                                                                               options:NSRegularExpressionCaseInsensitive
                                                                                 error:&error1];
        
        //        
         NSString *webaddress=@"http://www.baidu.com/dd/adb.htm?adc=e12&xx=lkw&dalsjd=12";
        NSArray *matches = [regex1 matchesInString:webaddress
                                          options:0
                                            range:NSMakeRange(0, [webaddress length])];
        for (NSTextCheckingResult *match in matches) {
            //NSRange matchRange = [match range];
            //NSString *tagString = [webaddress substringWithRange:matchRange];  //      
            //        NSRange r1 = [match rangeAtIndex:1];
            //        if (!NSEqualRanges(r1, NSMakeRange(NSNotFound, 0))) {    //     1           ,        
            //            //NSString *tagName = [webaddress substringWithRange:r1];  //   1     
            //            return @"";
            //        }
            
            NSString *tagValue = [webaddress substringWithRange:[match rangeAtIndex:2]];  //   2     
            //    NSLog(@"  2     :%@
    ",tagValue); NSLog(@"tagvalue = %@",tagValue); }

    콘 솔 출력
    2016-03-15 17:41:19.609 RegularExp[54814:2551313] tagvalue = e12
    

    이상 은 NSRegularExpression 같은 종류 에 대한 사용 입 니 다.
    다음은 실 용적 인 것 을 확장 합 니 다.
    방법 1. 서술 어 NSPredicate 를 사용 하여 정규 표현 식 을 만 듭 니 다.
    일반적으로 저 희 는 서술 어 만 사용 하여 개발 자가 입력 한 문자열 이 합 법 적 인지 판단 할 수 있 을 뿐 다른 요구 가 없습니다.
    //        :        ,      
    NSString *regex = @"^[a-z0-9A-Z]*$";
    //                
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
    //       
    NSString *str = @"Hello100";
    //         
    if ([predicate evaluateWithObject:str]) {
        NSLog(@"Match");
    }
    

    위 에서 판단 한 결 과 는 Match 를 출력 하 는 것 입 니 다. 문자열 을 -, = 로 바 꾸 면!그런 판단 은 들 어가 지 않 는 다.
    방법 2. NSRegularExpression 을 통 해 지정 한 대상 을 가 져 옵 니 다.
    우 리 는 우리 가 원 하 는 결 과 를 얻 을 수 있 는 것 을 걸 러 낼 수 있 습 니 다. 코드 가 더욱 뚜렷 합 니 다.
    NSString *url = @"[email protected]";
    NSError *error;
    //   NSRegularExpression          
    NSRegularExpression *regex = [NSRegularExpression
                    regularExpressionWithPattern:@"[^@]*\\."
                    options:0
                    error:&error];
    if (!error) { //       
      //            
      NSTextCheckingResult *match = [regex firstMatchInString:url
                              options:0
                                range:NSMakeRange(0, [url length])];
      if (match) {
        //         
        NSString *result = [url substringWithRange:match.range];
        NSLog(@"%@",result);
      }
    } else { //      ,        
      NSLog(@"error - %@", error);
    }
    

    위 에 있 는 이 열 은 특정한 문자열 에서 '@' 으로 시작 하 는 구간 문자열 을 검색 하기 때문에 최종 적 으로 얻 은 문자열 의 끝 은 점 '을 포함 하고 최종 적 으로 출력 하 는 것 은' 163. '입 니 다.
    방법 3. NSRegular Expression 은 여러 가지 결 과 를 얻 을 수 있 습 니 다. 즉, 맨 위 에 있 는 우리 의 수요 입 니 다.
    우 리 는 연속 적 인 숫자 서열 을 얻 는 정규 를 설명 한다
    NSString *regex = @"\\-\\d*\\.";
    NSString *str = @"-111.-666.-888.";
    NSError *error;
    NSRegularExpression *regular = [NSRegularExpression regularExpressionWithPattern:regex
                                                                             options:NSRegularExpressionCaseInsensitive
                                                                               error:&error];
    //  str       
    NSArray *matches = [regular matchesInString:str
                                        options:0
                                          range:NSMakeRange(0, str.length)];
    //            
    for (NSTextCheckingResult *match in matches) {
        NSRange range = [match range];
        NSString *mStr = [str substringWithRange:range];
        NSLog(@"%@", mStr);
    }
    
    @"\\-\\d*\\."; 우리 가 있 는 이곳 의 규칙 은 - 번호 시작, \ 는 특수 문자 의 전 의 를 대표 하고 일치 에 참여 하지 않 습 니 다. "\ d" 는 [0 - 9] 에 해당 하 며 \ \ 시작 하 는 규칙 이 있 습 니 다. 전의 문 자 를 넣 어야 합 니 다. "방법 3 의 출력 결 과 는?
    -111.
    -666.
    -888.
    

    인쇄 결 과 를 통 해 우 리 는 방법 3 의 결과 가 여러 개 라 는 것 을 알 수 있 고 우리 가 원 하 는 결 과 를 얻 을 수 있다.
    주석: 자주 사용 하 는 문 자 를 주석 합 니 다.
  • “\” : 、 、 , 。 :“\
    ” “
    ” "
    "。 “\\” “\” “\(” “(”
  • "^": , RegExp Multiline ,^ “
    ” “\r” 。
  • "$" : 。 RegExp Multiline ,$ “
    ” “\r” 。
  • "*": ( 0 )。 ,zo* “z”,“zo” “zoo”。* {0,}。
  • "+": ( 1 )。 ,“zo+” “zo” “zoo”, “z”。+ {1,}。
  • "?": 。 ,“do(es)?” “do” “does” “do”。? {0,1}。
  • "{n}":n 。 n 。 ,“o{2}” “Bob” “o”, “food” o。
  • "{n,}":n 。 n 。 ,“o{2,}” “Bob” “o”, “foooood” o。“o{1,}” “o+”。“o{0,}” “o*”。
  • "{n,m}":m n , n<=m。 n m 。 ,“o{1,3}” “fooooood” o。“o{0,1}” “o?”。 。
  • "?": (*,+,?,{n},{n,},{n,m}) , 。 , 。 , “oooo”,“o+?” “o”, “o+” “o”。
  • ".": “\r
    ” 。 “\r
    ” , “[\s\S]” 。
  • "\s" :" , 、 、 。 [ \f
    \r\t\v]。"

  • 바로 여기까지 입 니 다. 링크 를 보십시오. 정규 사용 설명

    좋은 웹페이지 즐겨찾기