Heim  >  Artikel  >  Web-Frontend  >  Detaillierte Einführung in die Verwendung regulärer Ausdrücke in C++

Detaillierte Einführung in die Verwendung regulärer Ausdrücke in C++

php中世界最好的语言
php中世界最好的语言Original
2018-03-29 17:57:001513Durchsuche

Dieses Mal werde ich Ihnen eine detaillierte Einführung in die Verwendung regulärer Ausdrücke in C++ geben. Was sind die Vorsichtsmaßnahmen bei der Verwendung regulärer Ausdrücke in C++?

Regulärer AusdruckRegex (regulärer Ausdruck) ist ein leistungsstarkes Werkzeug zur Beschreibung von Zeichenfolgen. Reguläre Ausdrücke gibt es in vielen Sprachen. Als Teil des neuen Standards werden außerdem sechs verschiedene reguläre Ausdruckssyntaxen unterstützt: ECMASCRIPT, Basic, Extended, Awk, Grep und Egrep . ECMASCRIPT ist die Standardsyntax. Wir können angeben, welche Syntax beim Erstellen des regulären Ausdrucks verwendet werden soll.

Regulärer Ausdruck ist ein Textmuster. Reguläre Ausdrücke sind leistungsstarke, praktische und effiziente Textverarbeitungswerkzeuge. Reguläre Ausdrücke selbst, gepaart mit allgemeiner Musternotation wie eine Taschen-Programmiersprache, geben Benutzern die Möglichkeit, Text zu beschreiben und zu analysieren. Mit zusätzlicher Unterstützung durch spezielle Tools können reguläre Ausdrücke verschiedene Arten von Text und Daten hinzufügen, löschen, trennen, überlagern, einfügen und zuschneiden.

Ein vollständiger regulärer Ausdruck besteht aus zwei Arten von Zeichen: Sonderzeichen werden „Metazeichen“ genannt, andere sind „wörtliche“ oder normale Textzeichen wie Buchstaben, Zahlen, chinesische Schriftzeichen und Unterstriche). Metazeichen für reguläre Ausdrücke bieten leistungsfähigere Beschreibungsmöglichkeiten.

Wie Texteditoren unterstützen die meisten höheren Programmiersprachen reguläre Ausdrücke, wie z. B. Perl, Java, Python und C/C++. Diese Sprachen verfügen über eigene Pakete für reguläre Ausdrücke.

Ein regulärer Ausdruck ist nur eine Zeichenfolge, es gibt keine Längenbeschränkung. „Unterausdruck“ bezieht sich auf einen Teil des gesamten regulären Ausdrucks, normalerweise einen Ausdruck in Klammern oder einen durch „|“ getrennten Multiple-Choice-Zweig.

Standardmäßig wird bei Buchstaben in Ausdrücken die Groß-/Kleinschreibung beachtet.

Häufig verwendete Metazeichen:

1. „.“: Entspricht jedem einzelnen Zeichen außer „n“, wenn Sie mit „n“ übereinstimmen möchten. Jedes Zeichen von , Sie müssen ein Muster wie „[sS]“ verwenden. 2. „^“: entspricht dem

Eingabezeichen

dem Anfang der Zeichenfolge, entspricht keinem Zeichen, muss übereinstimmen „^“-Zeichen selbst, Sie müssen „^“ verwenden; 3. „$“: entspricht dem Ende der Eingabezeichenfolge, entspricht keinem Zeichen, um mit dem „$“-Zeichen selbst übereinzustimmen muss „$“ verwenden ; 4. „*“: Entspricht dem vorherigen Zeichen oder Unterausdruck null oder mehrmals, „*“ entspricht „{0,}“, z. B. „^*b“ kann mit „b“ „, „^b“, „^^b“, ... übereinstimmen;

5. „+“: Entspricht dem vorherigen Zeichen oder Unterausdruck einmal oder mehrmals, äquivalent zu „{1 ,}“, „a+b“ kann beispielsweise mit „ab“, „aab“, „aaab“, ... übereinstimmen;

6. „?“: Entspricht dem vorherigen Zeichen oder Unterausdruck null oder einmal, was äquivalent zu „{0,1}“ ist, z. B. „a[cd]?“ kann mit „a“, „ac“, „ad“ übereinstimmen; ", "?" , "{n}", "{n,}", "{n,m}", der Übereinstimmungsmodus ist "nicht gierig". Das „non-greedy“-Muster entspricht der kürzestmöglichen gesuchten Zeichenfolge, während das standardmäßige „greedy“-Muster der längstmöglichen gesuchten Zeichenfolge entspricht. Beispielsweise stimmt „o+?“ in der Zeichenfolge „oooo“ nur mit einem einzelnen „o“ überein, während „o+“ mit allen „o“ übereinstimmt. 7. „|“: Logischisieren Sie die beiden Übereinstimmungsbedingungen „; Oder“ (Oder)-Operation, wie z. B. der reguläre Ausdruck „(him|her)“ stimmt mit „itbelongs to him“ und „itgehört to her“ überein, kann aber nicht mit „itbelongs to them“ übereinstimmen;

8 „“: Markieren Sie das nächste Zeichen als Sonderzeichen, Text, Rückverweis oder oktales Escape-Zeichen. „n“ entspricht beispielsweise dem Zeichen „n“, „n“ entspricht dem Zeilenumbruchzeichen und die Sequenz „\“ entspricht „“ , "("match"(";

9. „w“: Übereinstimmung mit Buchstaben, Zahlen oder Unterstrichen, einem beliebigen Buchstaben, einer Zahl oder einem Unterstrich, d. h. einem beliebigen von A~Z, a~z, 0~9, _; . „W“: Entspricht jedem Zeichen, das kein Buchstabe, keine Zahl oder kein Unterstrich ist. 11. „s“: Entspricht jedem Leerzeichen, einschließlich Leerzeichen, Tabulatoren und Formularen Feeds usw., äquivalent zu „[fnrtv]“; 12. „S“: entspricht jedem Zeichen, das kein Leerzeichen ist, äquivalent zu „[^fnrtv]“; 13. „d“: Entspricht jeder Zahl von 0 bis 9, entspricht „[0-9]“ 14. „D“: Entspricht jedem nichtstelligen Zeichen, entspricht „[^0-9]“;

15. „b“: Entspricht einer Wortgrenze, also der Position zwischen dem Wort und dem Leerzeichen, also der Position zwischen dem Wort und dem Leerzeichen, stimmt mit keinem Zeichen überein, z. B. „erb“ stimmt mit „er“ in „never“ überein, stimmt aber nicht mit „er“ in „verb“ überein

16. „B“: Nicht-Wortgrenzen-Übereinstimmung , „erB“ entspricht „verb“ „er“ in „never“; 17. „f“: entspricht einem Formularvorschubzeichen, äquivalent zu „x0c“ und „cL“; 18. „n“: Entspricht einem Zeilenumbruchzeichen, äquivalent zu „x0a“ und „cJ“ 19. „r“: Entspricht einem Wagenrücklaufzeichen, äquivalent zu „x0d“ und „cM“; 🎜>

20. „t“: Entspricht einem Tabulatorzeichen, äquivalent zu „x09“ und „cI“;

21. „v“: Entspricht einem vertikalen Tabulatorzeichen, äquivalent zu „x0b“ und „cK“;

22. „cx“: entspricht dem durch „x“ angegebenen Steuerzeichen, z. B. entspricht cM dem Steuerzeichen „Strg-M“ oder dem Wagenrücklaufzeichen „x“. Der Wert muss zwischen „A-Z“ liegen. oder „a-z“. Wenn nicht, wird angenommen, dass c das „c“-Zeichen selbst ist

23. „{n}“: „n“ ist eine nicht negative ganze Zahl, die genau n-mal übereinstimmt , zum Beispiel, „o{2}“ stimmt nicht mit dem „o“ in „Bob“ überein, sondern mit den beiden „o“s in „food“ 24. „{n,}“: „n“ ist eine nicht negative ganze Zahl, die mindestens n-mal übereinstimmt. Beispielsweise stimmt „o{2,}“ nicht mit dem „o“ in „Bob“ überein, sondern mit allen „o“ in „foooood“, „ o{1",}" ist äquivalent zu "o+", "o{0,}" ist äquivalent zu "o*"

25. "{n,m}": "n" und " m“ sind nichtnegative Ganzzahlen, wobei n<=m mindestens n-mal und höchstens m-mal übereinstimmt. Beispielsweise entspricht „o{1,3}“ den ersten drei o in „foooooood“, „o{0 ,1}‘ ist äquivalent zu ‚o?‘. Beachten Sie, dass zwischen Kommas und Zahlen keine Leerzeichen eingefügt werden können. „ba{1,3}“ kann beispielsweise mit „ba“ oder „baa“ oder „baaa“ übereinstimmen >

26. „x| y“: entspricht „x“ oder „y“, zum Beispiel „z|food“ entspricht „z“ oder „food“ „(z|f)ood“ entspricht „zood“; oder „food“;

27. „[xyz]“: Entspricht jedem enthaltenen Zeichen, zum Beispiel „[abc]“ entspricht „a“ in „plain“; 28. „[^xyz]“: Umgekehrter Zeichensatz, entspricht jedem nicht enthaltenen Zeichen, entspricht jedem Zeichen außer „xyz“, zum Beispiel „[^abc]“ entspricht „p“ in „plain“; > 29. „[a-z]“:

Zeichenbereich

, entspricht jedem Zeichen innerhalb des angegebenen Bereichs, zum Beispiel „[a-z]“ entspricht jedem Kleinbuchstaben im Bereich „a“ bis „z“

30. „[^a-z]“: umgekehrtes Bereichszeichen, entspricht jedem Zeichen, das nicht im angegebenen Bereich liegt, zum Beispiel „[^a-z]“ entspricht jedem Zeichen, das nicht im Bereich von „a“ liegt „ bis „z“;

31. „( )“: Definieren Sie den Ausdruck zwischen „(“ und „)“ als „Gruppe“-Gruppe und speichern Sie die diesem Ausdruck entsprechenden Zeichen in einem temporären Bereich, a regulärer Ausdruck Es können bis zu 9 gespeichert und mit Symbolen von „1“ bis „9“ referenziert werden.

32. „(Muster)“: Übereinstimmungsmuster und Erfassung des passenden Unterausdrucks, den Sie verwenden können $0... Das Attribut $9 ruft erfasste Übereinstimmungen aus der resultierenden „Übereinstimmungs“-Sammlung

ab

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  
#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 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 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 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手机号码验证

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in die Verwendung regulärer Ausdrücke in C++. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn