C++ 正则表达式教程:C++ 中的正则表达式与示例

C++ 正则表达式教程解释了 C++ 中正则表达式的工作,包括正则表达式匹配、搜索、替换、输入验证和标记化的功能。

几乎所有的编程语言都支持正则表达式。 C++ 从 C++11 开始直接支持正则表达式。除了编程语言之外,大多数文本处理程序(如词法分析器、高级文本编辑器等)都使用正则表达式。

在本教程中,我们将探讨正则表达式的一般细节以及 C++ 编程方面的细节。

正则匹配中的基础符号

^开头
()[]或,
{}几次
$结尾

1. C++ 中的正则表达式 (Regex)

正则表达式是包含一系列字符的表达式,这些字符定义了可用于字符串搜索算法、查找或查找/替换算法等的特定搜索模式。正则表达式也用于输入验证。

大多数编程语言要么为正则表达式提供内置功能,要么通过库提供。从 C++11 开始,C++ 通过 标准库提供正则表达式支持。

用于解析正则表达式的正则表达式处理器将其转换为内部表示,该表示被执行并与表示正在搜索的文本的字符串匹配。 C++11 使用 ECMAScript 语法作为正则表达式的默认语法。 ECMAScript 很简单,但它提供了强大的正则表达式功能。 让我们看看我们在正则表达式中指定的一些模式,如范围规范、重复模式等。

1.1 范围规范

指定字符或文字的范围是正则表达式中使用的最简单的标准之一。

例如,我们可以指定一个从a到z的小写字母范围,如下所示:[a-z],这将只匹配一个小写字符。

下列条件:[A-Za-z0-9]
上面的表达式指定了包含一个大写字母、一个小写字母和0到9之间的数字的范围。

上述表达式中的方括号([])具有特殊含义,即用于指定范围。如果你想包含一个括号作为表达式的一部分,那么你需要转义它。

那么下面的表达式,[\[0-9]
上面的表达式表示一个左括号和一个0到9范围内的数字作为正则表达式。

但请注意,当我们使用 C++ 编程时,我们需要使用 C++ 特定的转义序列,如下所示:[\\[0-9]

1.2 重复模式

我们上面指定的范围示例只匹配一个字符或文字。如果我们想匹配多个字符,我们通常在模式中指定“表达式修饰符”,从而使其成为一个重复的模式。

表达式修饰符可以是+,表示匹配一个模式出现一次或多次,也可以是*,表示匹配一个模式出现零次或多次。

例如,下面的表达式,
[a-z]+ 匹配 a、aaa、abcd、softwaretestinghelp 等字符串。请注意,它永远不会匹配空白字符串。
[a-z]*将匹配一个空白字符串或任何上面的字符串。

如果要指定一组字符匹配一次或多次,则可以使用括号,如下所示:(Xyz)+

上面的表达式将匹配Xyz、XyzXyzXyzXyz等等。

2. C++正则表达式的例子

考虑一个匹配 MS-DOS 文件名的正则表达式,如下所示。

char regex_filename[] =[a-zA-Z_] [a-zA-Z_0-9]*\\.[a-zA-Z0-9]+;

上面的正则表达式可以解释如下:
匹配一个字母(小写,然后大写)或下划线。然后匹配零个或多个字符,其中每个字符可以是字母、下划线或数字。然后匹配文字点(.)。在点之后,匹配一个或多个字符,其中每个字符可以是表示文件扩展名的字母或数字。

3. C++正则表达式中使用的函数模板

现在让我们讨论在 C++ 中编写正则表达式时的一些重要函数模板。

3.1 regex_match()

此函数模板用于匹配给定的模式。如果给定的表达式与字符串匹配,则此函数返回 true。否则,该函数返回 false

以下是演示 regex_match 函数的 C++ 编程示例。

#include <iostream>
#include <string>
#include <regex>
using namespace std;
 
int main () {
 
   if (regex_match ("softwareTesting", regex("(soft)(.*)") ))
      cout << "string:literal => matched\n";
 
   const char mystr[] = "SoftwareTestingHelp";
   string str ("software");
   regex str_expr ("(soft)(.*)");
 
   if (regex_match (str,str_expr))
      cout << "string:object => matched\n";
 
   if ( regex_match ( str.begin(), str.end(), str_expr ) )
      cout << "string:range(begin-end)=> matched\n";
 
   cmatch cm;  //匹配的词语检索出来
   regex_match (mystr,cm,str_expr);
    
   smatch sm;
   regex_match (str,sm,str_expr);
    
   regex_match ( str.cbegin(), str.cend(), sm, str_expr);
   cout << "String:range, size:" << sm.size() << " matches\n";
 
   
   regex_match ( mystr, cm, str_expr, regex_constants::match_default );
 
   cout << "the matches are: ";
   for (unsigned i=0; i<sm.size(); ++i) {
      cout << "[" << sm[i] << "] ";
   }
 
   cout << endl;
 
   return 0;
}

请添加图片描述
在上面的程序中,首先,我们使用regex_match函数将字符串" softwareTesting "与正则表达式" (soft)(.*) "匹配。随后,我们还通过向regex_match传递字符串对象、范围等来演示regex_match的不同变体。

3.2 regex_search()

函数regex_search()用于在字符串中搜索匹配正则表达式的模式。

考虑下面的c++程序,它显示了regex_search()的用法。

#include <iostream> 
#include <regex> 
#include<string.h> 
using namespace std; 
   
int main() 
{ 
    //string to be searched
    string mystr = "She sells_sea shells in the sea shore"; 
   
    // regex expression for pattern to be searched 
    regex regexp("s[a-z_]+"); 
   
    // flag type for determining the matching behavior (in this case on string objects)
     smatch m; 
   
    // regex_search that searches pattern regexp in the string mystr  
    regex_search(mystr, m, regexp); 
  
    cout<<"String that matches the pattern:"<<endl;
    for (auto x : m) 
        cout << x << " "; 
    return 0; 
}

请添加图片描述
我们先指定一个字符串,然后使用regex对象指定一个正则表达式。这个字符串和regex连同smatch标志类型一起被传递给regex_search函数。该函数在输入字符串中搜索第一个出现的模式,并返回匹配的字符串。

3.3 regex_replace()

函数regex_replace()用于用字符串替换与正则表达式匹配的模式。

让我们使用一个c++程序来演示regex_replace()函数。

#include <iostream> 
#include <string> 
#include <regex> 
#include <iterator> 
using namespace std; 
   
int main() 
{  
    string mystr = "This is software testing Help portal \n"; 
     
    cout<<"Input string: "<<mystr<<endl;
       
    // regex to match string beginning with 'p' 
    regex regexp("p[a-zA-z]+"); 
    cout<<"Replace the word 'portal' with word 'website' : "; 
    // regex_replace() for replacing the match with the word 'website'  
    cout << regex_replace(mystr, regexp, "website"); 
     
    string result; 
       
    cout<<"Replace the word 'website' back to 'portal': ";
    // regex_replace( ) for replacing the match back with 'portal' 
    regex_replace(back_inserter(result), mystr.begin(), mystr.end(), 
                  regexp,  "portal"); 
   
    cout << result; 
   
    return 0; 
}

请添加图片描述
这里,我们有一个输入字符串。我们提供了一个正则表达式来匹配以 p 开头的字符串。然后我们将匹配的单词替换为website。接下来,我们将website替换回portal

4.C++输入验证

我们已经讨论了使用regex进行模式匹配的主要函数模板。值得注意的是,regex服务的主要目的是输入验证。可以使用regex表达式验证从标准输入设备输入的输入。

检查下面的程序,以演示如何使用regex验证传入的数据。

#include <iostream>
#include <regex>
#include <string>
using namespace std;
  
int main()
{
    string input;
    regex integer_expr("(\\+|-)?[[:digit:]]+");
    //As long as the input is correct ask for another number
    while(true)
    {
        cout<<"Enter the input: ";
        cin>>input;
        if(!cin) break;
        //Exit when the user inputs q
        if(input=="q")
            break;
        if(regex_match(input,integer_expr))
            cout<<"Input is an integer"<<endl;
        else
        {cout<<"Invalid input : Not an integer"<<endl;}
    }
}

请添加图片描述
这个程序匹配用户输入的输入,以验证它是否是整数。上面的输出显示,当输入一个整数时,它会给出一个适当的消息,而当输入任何其他数据时,它会将该消息作为无效输入。

5.总结

Regex在搜索引擎中用于搜索模式,搜索和替换应用程序的对话框,如字处理器和文本编辑器。Regex也用于UNIX实用程序,如sed、awk以及程序的词法分析。

在本教程中,我们已经看到了用于匹配、搜索和替换模式的函数。使用这些函数,我们基本上可以开发一个高效的应用程序,使用regex实现所需的功能。

Regex允许通过修补模式有效地验证输入或搜索并替换字符串,这可以使用很少的行来完成。

参考目录

https://www.softwaretestinghelp.com/regex-in-cpp/

<think>好的,我现在需要帮助用户了解如何在C++中使用正则表达式,并提供使用方法和示例。根据用户提供的引用资料,我需要整合这些信息并生成一个结构清晰的回答。 首先,用户提到的引用[1]介绍了C++正则表达式的基础符号和基本概念,比如^、()、[]、{}、$等,还有std::regex和std::smatch的用法。引用[2]和[4]详细说明了std::regex_iterator和sregex_iterator的作用,用于遍历所有匹配结果。引用[3]和[4]提供了代码示例,展示如何用这些类进行匹配。 我需要先确定回答的结构。用户要求使用方法及示例,所以应该分步骤讲解,比如包含头文件、创建正则表达式、使用regex_search和regex_iterator等。同时,每个步骤需要对应的代码示例,确保用户能理解如何实际操作。 另外,要注意用户提到的系统级指令,比如数学表达式用$...$格式,但这个问题可能不涉及数学公式,所以可能不需要处理这点。但需要确保LaTeX语法正确,不过这里的代码示例C++,所以可能不会有问题。回答需要用中文,生成相关问题,并在引用处添加标识。 现在需要检查每个引用内容如何对应到回答的不同部分。例如,regex_match和regex_search的区别,引用[1]提到了基础用法,而引用[4]展示了regex_iterator的使用,用来获取所有匹配结果。代码示例需要从引用[3]和[4]中提取,可能需要调整格式,使其更易读,比如添加注释说明。 可能需要注意的几个点: 1. 头文件<regex>的引入。 2. 正则表达式对象的创建,可能涉及不同构造函数,比如带标志如regex::icase。 3. regex_match和regex_search的区别,前者要求整个字符串匹配,后者查找子串。 4. 使用smatch来存储匹配结果,以及如何访问子匹配项。 5. 使用regex_iterator遍历所有匹配,如sregex_iterator的例子。 6. 宽字符版本的处理,如wregex和wsregex_iterator,但用户可能主要关注普通字符串,所以可以放在后面的注意事项里。 在组织内容时,应该先介绍基本步骤,再逐步展开每个部分,并附上示例代码。例如,先讲匹配整个字符串(regex_match),然后搜索子串(regex_search),最后遍历多个匹配(regex_iterator)。每个部分都配以代码和解释。 需要确保引用的正确标注,例如在提到regex_search时引用[1],在讨论regex_iterator时引用[2]和[4]。代码示例来自引用[3]和[4],需要适当调整并标注引用来源。 可能的问题点:用户提供的引用[3]中的代码示例有HTML转义字符,比如<和>,需要转换成正确的符号<和>。此外,需要确保代码缩进和格式正确,以便用户容易阅读。 最后,生成相关问题,可能涉及性能优化、常见错误、复杂正则表达式编写、宽字符处理等,根据引用内容中的知识点来设计问题。 总结步骤: 1. 引入头文件和命名空间。 2. 创建正则表达式对象,可能带选项。 3. 使用regex_match和regex_search进行匹配,展示示例。 4. 使用smatch获取匹配结果,访问子匹配。 5. 使用regex_iterator遍历所有匹配,给出示例。 6. 注意事项,如异常处理、性能、宽字符等。 7. 相关问题。 现在需要将这些步骤转化为结构化的回答,确保每个部分清晰,代码正确,引用正确标注。</think>### C++ 正则表达式使用方法示例 #### 1. 基础使用方法 ##### 步骤1:引入头文件命名空间 ```cpp #include <regex> using namespace std; ``` ##### 步骤2:创建正则表达式对象 使用 `std::regex` 类定义正则表达式: ```cpp regex pattern(R"(\d{3}-\d{8})"); // 匹配电话号码格式,如 010-12345678 ``` 支持正则标志(如忽略大小写): ```cpp regex email_pattern(R"(\w+@\w+\.com)", regex::icase); // 忽略大小写匹配邮箱[^1] ``` --- #### 2. 匹配搜索 ##### 方法1:完全匹配 (`regex_match`) ```cpp string s = "2023-08-15"; regex date_pattern(R"(\d{4}-\d{2}-\d{2})"); if (regex_match(s, date_pattern)) { cout << "日期格式正确" << endl; } ``` ##### 方法2:部分匹配 (`regex_search`) ```cpp string text = "联系方式: 010-87654321, 备用: 021-12345678"; smatch match; // 存储匹配结果 if (regex_search(text, match, pattern)) { cout << "找到电话号码: " << match.str() << endl; // 输出第一个匹配[^1] } ``` --- #### 3. 遍历所有匹配 (`regex_iterator`) 使用 `sregex_iterator` 获取所有匹配项: ```cpp string test_str = "Hello freind meizu cei world"; regex word_pattern(R"([[:alpha:]]*ei[[:alpha:]]*)", regex::icase); // 匹配含"ei"的单词(忽略大小写) for (sregex_iterator it(test_str.begin(), test_str.end(), word_pattern), end; it != end; ++it) { cout << "匹配到: " << it->str() << endl; // 输出 "freind", "cei"[^4] } ``` --- #### 4. 子匹配分组 通过 `smatch` 访问分组: ```cpp string log = "Error: 404 (Not Found)"; regex log_pattern(R"(Error: (\d+) \((.*)\))"); smatch groups; if (regex_search(log, groups, log_pattern)) { cout << "状态码: " << groups[1] << endl; // 输出 "404" cout << "描述: " << groups[2] << endl; // 输出 "Not Found" } ``` --- #### 5. 注意事项 1. **异常处理**:正则表达式语法错误会抛出 `std::regex_error`。 2. **性能**:复杂正则表达式可能影响性能,建议预编译正则对象。 3. **宽字符支持**:使用 `wregex` 和 `wsregex_iterator` 处理宽字符(如中文)[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值