>  기사  >  웹 프론트엔드  >  C++의 정규식 사용에 대한 자세한 소개

C++의 정규식 사용에 대한 자세한 소개

php中世界最好的语言
php中世界最好的语言원래의
2018-03-29 17:57:001556검색

이번에는 C++에서 정규식 사용에 대해 자세히 소개하겠습니다. C++에서 정규식을 사용할 때 주의사항은 무엇인가요? 실제 사례를 살펴보겠습니다.

정규식Regex(정규식)는 문자 시퀀스를 설명하는 강력한 도구입니다. 정규식은 여러 언어에 존재합니다. 정규식은 새로운 표준의 일부로 C++11에도 포함되어 있습니다. 뿐만 아니라 ECMASCRIPT, 기본, 확장, awk, grep 및 egrep과 같은 6가지 정규식 구문도 지원합니다. . ECMASCRIPT는 기본 구문입니다. 정규식을 구성할 때 사용할 구문을 지정할 수 있습니다.

                                                      정규 표현식은 텍스트 패턴입니다. 정규식은 강력하고 편리하며 효율적인 텍스트 처리 도구입니다. 포켓 프로그래밍 언어와 같은 일반 패턴 표기법과 결합된 정규식 자체는 사용자에게 텍스트를 설명하고 분석하는 기능을 제공합니다. 특정 도구에서 제공되는 추가 지원을 통해 정규 표현식은 다양한 유형의 텍스트와 데이터를 추가, 삭제, 분리, 오버레이, 삽입 및 다듬을 수 있습니다. ㅋㅋㅋ >                                           . 문자, 숫자, 한자, 밑줄). 정규식 메타문자는 더욱 강력한 설명 기능을 제공합니다.

텍스트 편집기와 마찬가지로 대부분의 고급 프로그래밍 언어는 Perl, Java, Python 및 C/C++와 같은 정규식을 지원합니다. 이러한 언어에는 자체 정규식 패키지가 있습니다.

정규 표현식은 단순한 문자열이며 길이 제한이 없습니다. "하위 표현식"은 전체 정규 표현식의 일부를 의미하며 일반적으로 괄호 안의 표현식 또는 "|"로 구분된 객관식 분기를 나타냅니다.

기본적으로 표현식의 문자는 대소문자를 구분합니다.

           

일반적으로 사용되는 메타 문자:

1. ".": "n"을 제외한 모든 단일 문자와 일치하려면 "[sS]"와 같은 패턴을 사용해야 합니다.

2. "^":

입력 문자

문자열의 시작 위치와 일치하며, "^" 문자 자체와 일치하려면 "^"를 사용해야 합니다. 3. "$": 입력 문자열의 끝과 일치하며 어떤 문자와도 일치하지 않습니다. "$" 문자 자체와 일치하려면 "$"를 사용해야 합니다.

4. "*": 이전 문자 또는 하위 표현식과 0번 이상 일치합니다. " *"는 "{0,}"과 동일합니다. 예를 들어 "^*b"는 "b", "^b", "^^b", ...와 일치할 수 있습니다.

5. "+": 하나 이상의 일치 앞의 문자 또는 하위 표현식은 "{1,}"과 동일합니다. 예를 들어 "a+b"는 "ab", "aab", "aaab", ...와 일치할 수 있습니다. 6. " ?": 0회 또는 이전 문자 또는 하위 표현식을 한 번에 일치시킵니다. "{0,1}"과 동일합니다(예: "a[cd]?"는 "a", "ac", "ad"와 일치할 수 있음). 다른 한정자 "*", "+", "?", "{n}", "{n,}" 및 "{n,m}"이 뒤에 오는 경우 일치 패턴은 "non-greedy"입니다. . "non-greedy" 패턴은 검색된 가능한 가장 짧은 문자열과 일치하는 반면, 기본 "greedy" 패턴은 검색된 가능한 가장 긴 문자열과 일치합니다. 예를 들어 문자열 "oooo"에서 "o+?"는 단일 "o"에만 일치하는 반면 "o+"는 모든 "o"와 일치합니다.

7. "|": 논리적 "OR"(Or) 연산; 정규식 "(him|her)"는 "itbelongs to his" 및 "it owns to her"와 일치하지만 "itbelongs to them"과 일치할 수 없습니다.

8. "": 특수 문자로 표시된 다음 문자를 변경합니다. 문자, 텍스트, 역참조 또는 8진수 이스케이프 문자(예: "n"은 문자 "n"과 일치하고 "n"은 개행 문자와 일치하며 시퀀스 "\"는 "","("matches"(";)와 일치합니다.

9. “w”: 문자, 숫자 또는 밑줄, 모든 문자, 숫자 또는 밑줄, 즉 A~Z, a~z, 0~9, _ 중 하나와 일치

10. “W”: 일치 문자, 숫자 또는 밑줄이 아닌 모든 문자

11. "s": 공백, 탭, 양식 피드 등과 같은 공백 문자 중 하나를 포함하여 모든 공백 문자와 일치하며 "[fnrtv]와 동일합니다. ";

12. "S": 공백 문자가 아닌 모든 문자와 일치하며 "[^fnrtv]"와 동일합니다.

13. "d": 숫자, 임의의 숫자, 0에서 9 사이의 임의의 숫자와 일치합니다. , etc. "[0-9]"에 해당;

14. "D": "[^0-9]"에 해당하는 숫자가 아닌 문자와 일치합니다. 15. "b": 단어와 일치합니다. 즉, 단어와 공백 사이의 위치, 즉 단어와 공백 사이의 위치는 어떤 문자와도 일치하지 않습니다. 예를 들어 "erb"는 "never"의 "er"와 일치하지만 일치합니다. "동사"의 "er"와 일치하지 않습니다.

16. "B": 단어 경계가 아닌 일치, "erB"는 "동사"의 "er"와 일치하지만 "never"의 "er"와 일치하지 않습니다. ;

17. "f": "x0c" 및 "cL"에 해당하는 페이지 나누기 문자와 일치합니다. 18. "n": "x0a" 및 "cJ"에 해당하는 줄 바꿈 문자와 일치합니다. 19. "r": "x0d" 및 "cM"에 해당하는 캐리지 리턴 문자와 일치합니다. 20. "t": "x09" 및 "cI"에 해당하는 탭 문자와 일치합니다. 21. " v": "x0b" 및 "cK"에 해당하는 세로 탭 문자와 일치합니다.

22. "cx": "x"로 표시된 제어 문자와 일치합니다. 예를 들어 cM은 Control-M 또는 캐리지 리턴 문자와 일치합니다. "x" 값은 " A-Z" 또는 "a-z" 사이에 있어야 합니다. 그렇지 않은 경우 c는 "c" 문자 자체로 간주됩니다.

23. "{n}": "n "는 음수가 아닌 정수이며 정확히 n번 일치합니다. 예를 들어 "o{ 2}"는 "Bob"의 "o"와 일치하지 않지만 "food"의 두 "o"와 일치합니다.

24 . "{n,}": "n"은 음수가 아닌 정수이며 n번 이상 일치합니다. 예를 들어 "o{2,}"는 "Bob"의 "o"와 일치하지 않지만 모든 " "foooood"의 o", "o{1,}"는 "o+"와 동일하고, "o {0,}"는 "o*"와 동일합니다.

25. "{n,m}": "n " 및 "m"은 음수가 아닌 정수입니다. 여기서 n

26. "x|y": "x" 또는 "y"와 일치합니다. 예를 들어 "z|food"는 "z" 또는 "food"와 일치합니다. "(z|f)ood"는 "zood"와 일치합니다. "food";

27. "[xyz]": 문자 세트, 포함된 모든 문자와 일치합니다. 예를 들어 "[abc ]"는 "plain"의 "a"와 일치합니다.

28. "[^xyz]": 역방향 문자 세트, 포함되지 않은 모든 문자와 일치, "xyz"를 제외한 모든 문자와 일치(예: "[^ abc]"는 "plain"의 "p"와 일치)

29. "[a-z]":

문자 범위

, 지정된 범위 내의 모든 문자와 일치합니다. 예를 들어, "[a-z]"는 "a"에서 "z "범위 내의 모든 소문자와 일치합니다.

30. "[^a-z]": 역방향 범위 문자, 모든 문자와 일치합니다. 예를 들어 "[^a-z]"는 "a"에서 "z" 사이에 있지 않은 모든 문자와 일치합니다.

31. "( )": "("와 사이의 표현식을 정의합니다. ")"를 "그룹" 그룹으로 지정하고 이 표현식과 일치하는 문자를 임시 영역에 저장하면 정규식으로 최대 9개까지 저장할 수 있으며 "1"부터 "9"까지 기호로 참조할 수 있습니다.

32. "(패턴)": 패턴을 일치시키고 일치하는 하위 표현식을 캡처할 수 있습니다. $0…$9 속성은 결과 "일치" 컬렉션에서 캡처된 일치 항목을 검색합니다.

 33.  “(?:pattern)”:匹配pattern但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配,这对于用”or”字符” (|)”组合模式部件的情况很有用, 如,”industr(?:y|ies)”是比”industry|industries”更简略的表达式;

 34.  “(?=pattern)”: 非获取匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。如,"Windows(?=95|98|NT|2000)"能匹配"Windows2000"中的"Windows",但不能匹配"Windows3.1"中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始;

 35.  “(?!pattern)”: 非获取匹配,正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。如"Windows(?!95|98|NT|2000)"能匹配"Windows3.1"中的"Windows",但不能匹配"Windows2000"中的"Windows";

 要匹配某些特殊字符,需在此特殊字符前面加上”\”,如要匹配字符”^”、”$”、”()”、”[]”、”{}”、”.”、”?”、”+”、”*”、”|”,需使用” \^”、” \$”、” \ (“、”\)”、” \ [“、”\]”、” \{“、”\}”、” \.”、” \?”、” \+”、” \*”、” \|”。

 在C++/C++11中,GCC版本是4.9.0及以上,VS版本为VS2013及以上时,会有regex头文件,此头文件中会有regex_match、regex_search、regex_replace等函数可供调用,以下是测试代码:

#include "regex.hpp" 
#include <regex> 
#include <string> 
#include <vector> 
#include <iostream> 
int test_regex_match() 
{ 
 std::string pattern{ "\\d{3}-\\d{8}|\\d{4}-\\d{7}" }; // fixed telephone 
 std::regex re(pattern); 
 std::vector<std::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\n", tmp.c_str()); 
  else fprintf(stderr, "%s, can not match\n", tmp.c_str()); 
 } 
 return 0; 
} 
int test_regex_search() 
{ 
 std::string pattern{ "http|hppts://\\w*$" }; // url 
 std::regex re(pattern); 
 std::vector<std::string> str{ "http://blog.csdn.net/fengbingchun", "https://github.com/fengbingchun", 
  "abcd://124.456", "abcd 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\n", tmp.c_str()); 
  else fprintf(stderr, "%s, can not search\n", 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 , my github addr is: 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<std::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\n", tmp.c_str(), ret.c_str()); 
 } 
 return 0; 
} 
int test_regex_replace2() 
{ 
 // reference: http://www.cplusplus.com/reference/regex/regex_replace/ 
 std::string s("there is a subsequence in the string\n"); 
 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; 
}

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

使用正则表达式提取字符串详解(附代码)

容易产生错误的js手机号码验证

위 내용은 C++의 정규식 사용에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.