C + + 11 정규 표현 식 소개 및 간단 한 사용

11935 단어
본 고 는 많은 인터넷 블 로그 내용 을 정리 한 후에 형 성 된 것 으로 인용 내용 의 저작권 은 원시 작가 의 소유 이 고 학습 연구 에 만 국한 되 며 그 어떠한 상업 적 용도 로 도 사용 할 수 없다.
정규 표현 식 (regular expression) 은 컴퓨터 과학 의 개념 이자 규칙 표현 식 이 라 고도 부 릅 니 다. 보통 regex, regexp, RE, regexps, regexes, regexen 으로 간략하게 쓰 입 니 다.다음은 본 고 를 통 해 정규 표현 식 소개 와 C + + 11 에서 의 간단 한 사용 튜 토리 얼 을 소개 합 니 다.
정규 표현 식 Regex (regular expression) 는 문자 배열 을 설명 하 는 강력 한 도구 입 니 다.많은 언어 에 정규 표현 식 이 존재 합 니 다. C + + 11 에서 도 정규 표현 식 을 새로운 표준 의 일부분 에 포함 시 켰 습 니 다. 뿐만 아니 라 6 가지 서로 다른 정규 표현 식 의 문법 도 지원 합 니 다. 각각 ECMASCRIPT, basic, extended, awk, grep 와 egrep 입 니 다.그 중에서 ECMASCRIPT 는 기본 문법 으로 어떤 문법 을 구체 적 으로 사용 하면 정규 표현 식 을 구성 할 때 지정 할 수 있 습 니까?
정규 표현 식 은 텍스트 모드 입 니 다.정규 표현 식 은 강력 하고 편리 하 며 효율 적 인 텍스트 처리 도구 입 니 다.정규 표현 식 자체 에 포켓 프로 그래 밍 언어 와 같은 유 니 버 설 패턴 표현 법 (genel pattern notation) 을 더 해 사용자 에 게 텍스트 를 설명 하고 분석 하 는 능력 을 부여 합 니 다.특정 도구 가 제공 하 는 추가 지원 에 맞 춰 정규 표현 식 은 추가, 삭제, 분리, 중첩, 삽입, 수정 등 다양한 종류의 텍스트 와 데 이 터 를 추가 할 수 있 습 니 다.
완전한 정규 표현 식 은 두 가지 문자 로 구성 되 어 있 습 니 다. 특수 문자 (special characters) 는 '메타 문자' (meta characters), 다른 것 은 '문자' (literal) 또는 일반 텍스트 문자 (normal text characters, 예 를 들 어 자모, 숫자, 한자, 밑줄) 입 니 다.정규 표현 식 의 메타 문 자 는 더욱 강력 한 설명 능력 을 제공 합 니 다.
텍스트 편집기 와 마찬가지 로 대부분의 고급 프로 그래 밍 언어 는 정규 표현 식 을 지원 합 니 다. 예 를 들 어 Perl, 자바, Python, C / C + + 등 언어 는 각각 정규 표현 식 패키지 가 있 습 니 다.
정규 표현 식 은 길이 제한 이 없 는 문자열 입 니 다.'하위 표현 식' 은 전체 정규 표현 식 의 일부분 을 말 합 니 다. 보통 괄호 안에 있 는 표현 식 이나 '|' 으로 나 누 어 진 다 중 선택 분 지 를 말 합 니 다.
기본적으로 표현 식 의 자 모 는 대소 문 자 를 구분 해 야 합 니 다.
자주 사용 하 는 메타 문자:
문자
기능 설명
"."
"" 를 제외 한 모든 단일 문자 와 일치 합 니 다. "" 를 포함 한 임의의 문자 와 일치 하려 면 "[\ s \ S]" 와 같은 모드 를 사용 해 야 합 니 다.
"^"
입력 문자열 의 시작 위치 와 일치 합 니 다. 어떤 문자 도 일치 하지 않 습 니 다. "^" 문자 자체 와 일치 하려 면 "\ ^" 를 사용 해 야 합 니 다.
"$"
입력 문자열 의 끝 위치 와 일치 합 니 다. 어떤 문자 와 도 일치 하지 않 습 니 다. "$" 문자 자체 와 일치 하려 면 "\ $" 를 사용 해 야 합 니 다.
"*"
0 회 또는 여러 번 앞의 문자 나 하위 표현 식 과 일치 합 니 다. "" {0,} "과 같은 효 과 를 가 집 니 다. 예 를 들 어" ^ b "는" b "," b "," ^ b "와 일치 할 수 있 습 니 다.
"+"
한 번 또는 여러 번 앞의 문자 나 하위 표현 식 과 일치 합 니 다. "{1,}" 과 같 습 니 다. 예 를 들 어 "a + b" 는 "ab", "aab", "aaab" 와 일치 할 수 있 습 니 다.
"?"
0 회 또는 한 번 에 앞의 문자 나 하위 표현 식 과 일치 하 는 것 은 '{0, 1}' 과 같 습 니 다. 예 를 들 어 'a [cd]?' 는 'a', 'ac', 'ad' 와 일치 할 수 있 습 니 다. 이 문 자 는 다른 한정 문자 인 '*', '+', '?', '{n}', '{n,}', '{n, m}' 에 따라 일치 할 때 일치 하 는 패턴 은 '욕심 이 아 닙 니 다' 입 니 다.'욕심 이 아 닌' 모드 는 검색 한 문자열 과 일치 합 니 다. 가능 한 한 짧 은 문자열 입 니 다. 기본 적 인 '욕심 많은' 모드 는 검색 한 문자열 과 일치 합 니 다. 가능 한 한 긴 문자열 입 니 다.예 를 들 어 문자열 'oooo' 에서 'o +?' 는 하나의 'o' 만 일치 하고 'o +' 는 모든 'o' 와 일치 합 니 다.
"|"
정규 표현 식 "(him | her)" 과 "it belongs to him", "it belongs to her" 와 같은 두 개의 일치 조건 을 논리 적 으로 "또는" (Or) 연산 하지만 "itbelongs to her" 와 일치 할 수 없습니다.
""
다음 문 자 를 특수 문자, 텍스트, 역방향 참조 또는 8 진 전의 문자 로 표시 합 니 다. 예 를 들 어 "n" 일치 문자 "n", "일치 줄 바 꿈 문자, 시퀀스" \ "일치", "(" 일치 ")
"\w"
알파벳 이나 숫자 또는 밑줄, 임의의 알파벳 이나 숫자 또는 밑줄, 즉 AZ, az, 0 ~ 9, 중 임의의 것 과 일치 합 니 다.
"\W"
알파벳, 숫자, 밑줄 이 아 닌 문자 와 일치 합 니 다.
"\s"
빈 칸, 탭 문자, 페이지 바 꾸 기 등 빈 문자 중 하 나 를 포함 하여 임의의 공백 문자 와 일치 합 니 다. "[\ f \ r \ t \ v]" 와 같은 효 과 를 가 집 니 다.
"\S"
공백 문자 가 아 닌 임의의 문자 와 일치 합 니 다. "[^ \ f \ r \ t \ v]" 와 같은 효 과 를 가 집 니 다.
"\d"
일치 하 는 숫자, 임의의 숫자, 0 ~ 9 중의 임의의 하 나 는 '[0 - 9]' 와 같다.
"\D"
임의의 비 숫자 문자 와 일치 합 니 다. "[^ 0 - 9]" 와 같 습 니 다.
"\b"
한 글자 의 경계, 즉 글자 와 빈 칸 사이 의 위치, 즉 단어 와 빈 칸 사이 의 위치 가 일치 하지 않 습 니 다. 예 를 들 어 'er \ b' 는 'never' 의 'er' 와 일치 하지만 'verb' 의 'er' 와 일치 하지 않 습 니 다.
"\B"
비 글자 경계 가 일치 합 니 다. "er \ B" 는 "verb" 의 "er" 와 일치 하지만 "never" 의 "er" 와 일치 하지 않 습 니 다.
"\f"
"\ x0c" 와 "\ cL" 과 같은 페이지 바 꾸 기 문자 가 일치 합 니 다.
""
줄 바 꿈 문자 와 일치 합 니 다. "\ x0a" 와 "\ cJ" 와 같 습 니 다.
"\r"
"\ x0d" 와 "\ cM" 과 같은 리 턴 문자 가 일치 합 니 다.
"\t"
탭 문자 와 일치 합 니 다. "\ x09" 와 "\ cI" 와 같 습 니 다.
"\v"
수직 탭 문자 와 일치 합 니 다. "\ x0b" 와 "\ cK" 와 같 습 니 다.
"\cx"
"x" 지시 와 일치 하 는 제어 문자, 예 를 들 어 \ cM 은 control - M 또는 리 턴 문자 와 일치 합 니 다. "x" 의 값 은 "A - Z" 또는 "a - z" 사이 에 있어 야 합 니 다. 그렇지 않 으 면 c 가 "c" 문자 자체 라 고 가정 합 니 다.
"{n}"
"n" 은 마이너스 정수 가 아 닙 니 다. n 번 과 딱 일치 합 니 다. 예 를 들 어 "o {2}" 은 "Bob" 의 "o" 와 일치 하지 않 지만 "food" 의 두 "o" 와 일치 합 니 다.
"{n,}"
"n" 은 마이너스 정수 가 아 닙 니 다. 적어도 n 번 은 일치 합 니 다. 예 를 들 어 "o {2,}" 은 "Bob" 중의 "o" 와 일치 하지 않 고 "fooood" 중의 모든 "o", "o {1,}" 은 "o +", "o {0,}" 은 "o *" 와 같 습 니 다.
"{n,m}"
'n' 과 'm' 은 마이너스 정수 가 아 닙 니 다. 그 중에서 n < = m 는 적어도 n 번, 최대 m 번 일치 합 니 다. 예 를 들 어 'o {1, 3}' 은 'foooood' 의 첫 세 번 째 o, 'o {0, 1}' 과 일치 합 니 다. 'o?' 와 같은 효 과 를 가 집 니 다. 빈 칸 을 쉼표 와 숫자 사이 에 삽입 하면 안 됩 니 다. 예 를 들 어 'ba {1, 3}' 은 'ba' 나 'baa' 또는 'baaa' 와 일치 할 수 있 습 니 다.
"x|y"
"x" 또는 "y" 와 일치 합 니 다. 예 를 들 어 "z | food" 는 "z" 또는 "food" (z | f) ood "와" zood "또는" food "와 일치 합 니 다.
"[xyz]"
문자 집합, 포 함 된 모든 문자 와 일치 합 니 다. 예 를 들 어 "[abc]" 는 "plain" 의 "a" 와 일치 합 니 다.
"[^xyz]"
역방향 문자 집합, 포함 되 지 않 은 모든 문자 와 일치 합 니 다. "xyz" 를 제외 한 임의의 문자 와 일치 합 니 다. 예 를 들 어 "[^ abc]" 는 "plain" 의 "p" 와 일치 합 니 다.
"[a-z]"
문자 범위, 지정 한 범위 내의 모든 문자 와 일치 합 니 다. 예 를 들 어 "[a - z]" 는 "a" 에서 "z" 범위 내의 모든 소문 자 와 일치 합 니 다.
"[^a-z]"
역방향 범위 문자, 지정 하지 않 은 범위 내 에 있 는 모든 문자 와 일치 합 니 다. 예 를 들 어 "[^ a - z]" 는 "a" 에서 "z" 범위 내 에 있 지 않 은 모든 문자 와 일치 합 니 다.
"( )"
"(" 와 ")" 사이 의 표현 식 을 "그룹" group 로 정의 하고 이 표현 식 과 일치 하 는 문 자 를 임시 영역 에 저장 합 니 다. 정규 표현 식 은 최대 9 개 까지 저장 할 수 있 습 니 다. "\ 1" 에서 "\ 9" 기호 로 참조 할 수 있 습 니 다.
"(pattern)"
pattern 과 일치 하 는 하위 표현 식 을 캡 처 합 니 다. $0... $9 속성 은 결과 '일치' 집합 에서 캡 처 된 일치 성 을 검색 할 수 있 습 니 다.
"(?:pattern)"
pattern 과 일치 하지만 일치 하 는 하위 표현 식 을 캡 처 하지 않 습 니 다. 즉, 캡 처 되 지 않 고 나중에 사용 할 일치 하 는 표현 식 을 저장 하지 않 습 니 다. 이것 은 "or" 문자 "(|)" 조합 모드 위 젯 을 사용 하 는 경우 에 유용 합 니 다. 예 를 들 어 "industr (?: y | ies)" 는 "industry | industries" 보다 더 간략 한 표현 식 입 니 다.
"(?=pattern)"
일치 하지 않 습 니 다. 패턴 과 일치 하 는 문자열 의 시작 부분 에서 검색 문자열 과 일치 합 니 다. 이 일치 하 는 문자열 은 나중에 사용 할 필요 가 없습니다. 예 를 들 어 "Windows (? = 95 | 98 | NT | 2000)" 는 "Windows 2000" 의 "Windows" 와 일치 하지만 "Windows 3.1" 의 "Windows" 와 일치 하지 않 습 니 다.... 사전 검 사 는 문 자 를 소모 하지 않 습 니 다. 즉, 일치 가 발생 한 후 마지막 일치 후 바로 다음 일치 하 는 검색 을 시작 합 니 다. 사전 검 사 를 포함 한 문자 가 아 닌 다음 일치 하 는 검색 을 시작 합 니 다.
"(?!pattern)"
일치 하지 않 습 니 다. 사전 검 사 를 부정 하고 있 습 니 다. pattern 과 일치 하지 않 는 문자열 의 시작 부분 에서 검색 문자열 과 일치 합 니 다. 이 일치 하 는 문자열 은 나중에 사용 할 필요 가 없습니다. 예 를 들 어 "Windows (?! 95 | 98 | NT | 2000)" 는 "Windows 3.1" 의 "Windows" 와 일치 하지만 "Windows 2000" 의 "Windows" 와 일치 하지 않 습 니 다.
일부 특수 문 자 를 일치 시 키 려 면 이 특수 문자 앞 에 "^", ",", "\ (", ")", "\ [", "]", "{", "}", ".", "?", "+", "*", "|" 를 붙 여야 합 니 다.
C + + C + + 11 에서 GCC 버 전 은 4.9.0 이상 이 고 VS 버 전이 VS 2013 이상 일 때 regex 헤더 파일 이 있 습 니 다. 이 헤더 파일 에는 regex match, regex search, regex replace 등 함수 가 호출 될 수 있 습 니 다. 다음은 테스트 코드 입 니 다.
#include "regex.hpp"

#include 

#include 

#include 

#include 

int test_regex_match()

{

 std::string pattern{ "\\d{3}-\\d{8}|\\d{4}-\\d{7}" }; // fixed telephone

 std::regex re(pattern);

 std::vector<:string> str{ "010-12345678", "0319-9876543", "021-123456789"};

 /* std::regex_match:

           (  re)          str,         

    ,                  ,    false;           ,  true

 */

 for (auto tmp : str) {

  bool ret = std::regex_match(tmp, re);

  if (ret) fprintf(stderr, "%s, can match
", tmp.c_str()); else fprintf(stderr, "%s, can not match
", tmp.c_str()); } return 0; } int test_regex_search() { std::string pattern{ "http|[hppts://](https://www.jb51.net/article/104447.htmhppts://)\\w*$" }; // url std::regex re(pattern); std::vector<:string> str{ "[http://blog.csdn.net/fengbingchun](http://blog.csdn.net/fengbingchun)", "[https://github.com/fengbingchun](https://github.com/fengbingchun)", "[abcd://124.456](https://www.jb51.net/article/104447.htmabcd://124.456)", "abcd [https://github.com/fengbingchun](https://github.com/fengbingchun) 123" }; /* std::regex_search: regex_match, regex_search , re */ for (auto tmp : str) { bool ret = std::regex_search(tmp, re); if (ret) fprintf(stderr, "%s, can search
", tmp.c_str()); else fprintf(stderr, "%s, can not search
", tmp.c_str()); } return 0; } int test_regex_search2() { std::string pattern{ "[a-zA-z]+://[^\\s]*" }; // url std::regex re(pattern); std::string str{ "my csdn blog addr is: [http://blog.csdn.net/fengbingchun](http://blog.csdn.net/fengbingchun) , my github addr is: [https://github.com/fengbingchun](https://github.com/fengbingchun) " }; std::smatch results; while (std::regex_search(str, results, re)) { for (auto x : results) std::cout << x << " "; std::cout << std::endl; str = results.suffix().str(); } return 0; } int test_regex_replace() { std::string pattern{ "\\d{18}|\\d{17}X" }; // id card std::regex re(pattern); std::vector<:string> str{ "123456789012345678", "abcd123456789012345678efgh", "abcdefbg", "12345678901234567X" }; std::string fmt{ "********" }; /* std::regex_replace: re , fmt */ for (auto tmp : str) { std::string ret = std::regex_replace(tmp, re, fmt); fprintf(stderr, "src: %s, dst: %s
", tmp.c_str(), ret.c_str()); } return 0; } int test_regex_replace2() { // reference: [http://www.cplusplus.com/reference/regex/regex_replace/](http://www.cplusplus.com/reference/regex/regex_replace/) std::string s("there is a subsequence in the string
"); std::regex e("\\b(sub)([^ ]*)"); // matches words beginning by "sub" // using string/c-string (3) version: std::cout << std::regex_replace(s, e, "sub-$2"); // using range/c-string (6) version: std::string result; std::regex_replace(std::back_inserter(result), s.begin(), s.end(), e, "$2"); std::cout << result; // with flags: std::cout << std::regex_replace(s, e, "$1 and $2", std::regex_constants::format_no_copy); std::cout << std::endl; return 0; }

GitHub:https://github.com/fengbingchun/Messy_Test
참고 자료 정규 표현 식 소개 및 C + + 11 에서 의 간단 한 사용

좋은 웹페이지 즐겨찾기