C++正则表达式语法

发布时间:2023-05-21

一、正则表达式简介

正则表达式是一种描述文本模式的工具,它可以用一些特定的字符来匹配、查找和替换一段文本中的指定字段。 在C++中,我们可以使用regex头文件中提供的正则表达式类来操作文本流。它提供了一系列的方法,使我们可以使用正则表达式操作字符串。下面通过几个小标题来详细阐述其语法。

二、匹配字符

要在字符串中匹配某个字符,我们可以使用正则表达式中的字符集合,用[]括起来。在括号内部,我们可以列举要匹配的字符,也可以使用一些特殊字符来表示。 比如说,如果我们想匹配一个字母或数字,可以使用[]包裹它们:

std::string str = "Hello World! 123";
std::regex reg("[a-z0-9]", std::regex::icase); // 匹配不区分大小写的字母和数字
std::sregex_iterator it(str.begin(), str.end(), reg); // 迭代器
std::sregex_iterator end; // 结束迭代器
while (it != end) {
    std::smatch match = *it;
    std::cout << match.str() << std::endl;
    ++it;
}

上面的代码中,我们使用了[a-z0-9]来匹配字母和数字,同时使用了std::regex::icase来表示匹配不区分大小写。

三、匹配数量

在正则表达式中,我们可以使用一些特殊字符来描述字符的数量。

  • 第一个特殊字符是+,表示匹配一个或多个相同的字符。例如,如果我们使用a+b+来匹配一个字符串,它将匹配至少一个a和一个b,然后是一系列的b字符。
  • 第二个特殊字符是*,表示匹配零个或多个相同的字符。例如,使用ab*c来匹配字符串,它将匹配一个a、任意数量的b,然后是一个c。
  • 第三个特殊字符是?,表示匹配零个或一个字符。例如,使用colou?r来匹配color和colour。
  • 除此之外,我们还可以使用花括号来匹配指定数量的字符,如{2,5}表示匹配2到5个字符。

四、匹配位置

在正则表达式中,我们还可以使用两个特殊字符来匹配位置。这两个字符是^$

  • 字符^匹配字符串的开头。例如,使用^Hello来匹配以Hello开头的字符串。
  • 字符$匹配字符串的结尾。例如,使用World!$来匹配以World!结尾的字符串。

五、分组

在正则表达式中,我们可以使用圆括号来分组。这样做的好处是可以在匹配时获取到分组中的内容,并且还可以对分组中的内容进行操作。 例如,我们可以使用(\d+)-(\d+)-(\d+)来匹配格式为yyyy-mm-dd的日期。这里使用了三个分组,分别匹配年、月、日。通过获取到每个分组的内容,我们就可以对每个日期部分进行操作。

六、替换

regex库中提供了replace函数,可以用来在字符串中查找和替换目标子串。在替换的参数中,我们可以使用$符号来引用正则表达式的分组。 例如,如果我们想将字符串中的所有数字替换为0,我们可以使用以下代码:

std::string str = "Hello World! 123";
std::regex reg("\\d+"); // 匹配数字
std::string newStr = std::regex_replace(str, reg, "0"); // 将数字替换为0
std::cout << newStr << std::endl;

注意,这里使用了双反斜杠来转义\,因为\在C++中是特殊字符。