C++ での正規表現の使用方法の詳細な紹介

php中世界最好的语言
リリース: 2018-03-29 17:57:00
オリジナル
1520 人が閲覧しました

今回は、C++ での正規表現の使用について詳しく説明します。C++ で正規表現を使用する際の 注意事項 は何ですか?実際のケースを見てみましょう。

Regex (正規表現) は、文字シーケンスを記述するための強力なツールです。正規表現は多くの言語に存在し、C++11 には新しい標準の一部として含まれているだけでなく、ECMASCRIPT、basic、extended、awk、grep、egrep という 6 つの異なる正規表現構文もサポートされています。 。 ECMASCRIPT はデフォルトの構文です。正規表現を作成するときに使用する構文を指定できます。 正規表現はテキストのパターンです。正規表現は、強力で便利、効率的なテキスト処理ツールです。正規表現自体と、ポケット

プログラミング言語

のような一般的なパターン表記法を組み合わせることで、ユーザーはテキストを記述および分析することができます。特定のツールによって提供される追加サポートにより、正規表現を使用して、さまざまな種類のテキストとデータを追加、削除、分離、オーバーレイ、挿入、トリミングできます。 文字、数字、下線)。正規表現メタキャラクターは、より強力な説明機能を提供します。

テキスト エディターと同様、Perl、Java、Python、C/C++ などのほとんどの高級プログラミング言語は正規表現をサポートしています。これらの言語には独自の正規表現パッケージがあります。

正規表現は単なる文字列であり、長さに制限はありません。 「部分式」とは、正規表現全体の一部を指し、通常は括弧内の式、または「|」で区切られた複数選択の分岐を指します。

デフォルトでは、式内の文字は大文字と小文字が区別されます。

一般的に使用されるメタ文字:

1. 「.」: 「n」を含む任意の文字と一致するには、「[sS]」などのパターンを使用する必要があります。

2. 「^」:

入力文字

文字列の開始位置に一致します。「^」文字自体に一致するには、「^」を使用する必要があります。

3. 「$」:入力文字列の末尾に一致します。どの文字にも一致しません。「$」文字自体に一致するには、「$」を使用する必要があります。

4. 「*」: 前の文字または部分式に 0 回以上一致します。 「 *」は「{0,}」と同等です。たとえば、「^*b」は「b」、「^b」、「^^b」、... と一致します。 5. 「+」: 1 つ以上の一致 先行する文字または部分式は「{1,}」と同等です。たとえば、「a+b」は「ab」、「aab」、「aaab」、... と一致します。 ?": ゼロ回 前の文字または部分式に一度に一致します。「{0,1}」に相当します。たとえば、「a[cd]?」は「a」、「ac」、「ad」に一致します。他の修飾子「*」、「+」、「?」、「{n}」、「{n,}」、「{n,m}」が続く場合、一致パターンは「非貪欲」になります。 。 「非貪欲」パターンは検索される可能な限り短い文字列に一致しますが、デフォルトの「貪欲」パターンは検索される可能な限り長い文字列に一致します。たとえば、文字列「oooo」では、「o+?」は 1 つの「o」にのみ一致しますが、「o+」はすべての「o」に一致します

7. 「|」: 論理「OR」(または)演算。正規表現「(him|her)」は「itbelongs to his」と「it Belongs to her」に一致しますが、「itbelongs to them」には一致しません。

8. "": 特殊文字としてマークされた次の文字を変更します。文字、テキスト、後方参照、または 8 進エスケープ文字。たとえば、「n」は文字「n」に一致し、「n」は改行文字に一致し、シーケンス「\」は「","("一致"(";

9. 「w」: 文字、数字、またはアンダースコア、つまり A ~ Z、a ~ z、0 ~ 9、_ のいずれかに一致します。

10. 「W」: 一致します。文字、数字、またはアンダースコアではない任意の文字

11. "s": スペース、タブ、フォーム フィードなどの任意の空白文字を含む、「[fnrtv]」と同等の空白文字と一致します。 ";

12. "S": "[^fnrtv]" に相当する、空白文字ではない任意の文字に一致します。

13. "d": 0 から 9 までの任意の数字に一致します。 、など。「[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" に相当します。 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」の 2 つの「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" に一致します。 "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. 「( )」: 「(」と「z」の間の式を定義します。 ")" を "group" グループとして、この式に一致する文字を一時領域に保存します。正規表現で最大 9 個まで保存でき、"1" から "9" までの記号で参照できます。

32. "(pattern)": パターンを照合し、一致する部分式をキャプチャします。$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 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!