📜  std :: regex_match,std :: regex_replace()| C++中的正则表达式(正则表达式)(1)

📅  最后修改于: 2023-12-03 14:47:42.693000             🧑  作者: Mango

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

在C++中,正则表达式(Regex)是用于搜索、匹配和替换字符串的工具。正则表达式是一种模式匹配语言,它可以描述字符序列的模式。Regex模式通常用于在字符串中搜索特定模式的文本,并在满足条件的情况下,执行某些操作。

C++ 11引入了标准库中的regex头文件。该库提供了许多函数来创建、使用和操作Regex模式。

Regex基本语法

Regex可以使用std::regex类来创建。下面是一个简单的正则表达式例子:

#include <regex>
#include <iostream>

int main()
{
    std::string str = "Hello World";
    std::regex regexPattern("World");
    std::smatch results;

    if (std::regex_search(str, results, regexPattern))
    {
        std::cout << "Match Found: " << results.str() << std::endl;
    }
    else
    {
        std::cout << "Match Not Found!" << std::endl;
    }

    return 0;
}

该代码将输出“Match Found: World”。在上面的代码中,正则表达式“World”将搜索字符串“Hello World”,并且当匹配成功时将结果输出。

Regex的语法与其他编程语言中的语法略有不同。下面是一些基本的Regex语法:

| 符号 | 描述 | | ---- | ---- | | . | 匹配任意单个字符 | | \ | 转义字符 | | * | 匹配前面的字符零次或多次 | | + | 匹配前面的字符一次或多次 | | ? | 匹配前面的字符零次或一次 | | () | 分组单元,用于在匹配后提取文本 | | [] | 匹配指定的字符范围 | | ^ | 匹配字符的开头 | | $ | 匹配字符串的结尾 |

Regex Match和Regex Replace

C++提供了两个主要的Regex函数:std::regex_matchstd::regex_replace。下面我们来了解一下它们的用法。

Regex Match

std::regex_match函数用于检查一个字符串是否与Regex模式匹配。

下面是一个例子:

#include <regex>
#include <iostream>

int main()
{
    std::string str = "Hello World";
    std::regex regexPattern("[a-zA-Z ]+");
    bool is_match = std::regex_match(str, regexPattern);
    std::cout << "Is Match: " << (is_match ? "True" : "False") << std::endl;
    return 0;
}

在上面的代码中,我们使用std::regex_match函数来检查一个字符串str是否与Regex模式[a-zA-Z ]+匹配。该Regex模式将匹配任何包含字母或空格的字符串。

Regex Replace

std::regex_replace函数用于替换一个字符串中匹配了Regex模式的文本。

下面是一个例子:

#include <regex>
#include <iostream>

int main()
{
    std::string str = "Hello World!";
    std::regex regexPattern("World");
    std::string replaceWith = "Universe";
    std::string replacedStr = std::regex_replace(str, regexPattern, replaceWith);
    std::cout << "Replaced String: " << replacedStr << std::endl;
    return 0;
}

在上面的代码中,我们使用std::regex_replace函数将字符串str中匹配了Regex模式World的字符替换为Universe

Regex的Flags

Regex可以使用一些Flag来控制其行为。下面是一些Flag:

| Flag | 描述 | | ---- | ---- | | std::regex_constants::icase | 忽略大小写 | | std::regex_constants::nosubs | 不匹配子表达式 | | std::regex_constants::optimize | 对Regex模式进行优化 |

忽略大小写

下面是一个例子:

#include <regex>
#include <iostream>

int main()
{
    std::string str = "Hello World";
    std::regex regexPattern("world", std::regex_constants::icase);
    std::smatch results;

    if (std::regex_search(str, results, regexPattern))
    {
        std::cout << "Match Found: " << results.str() << std::endl;
    }
    else
    {
        std::cout << "Match Not Found!" << std::endl;
    }

    return 0;
}

在上面的代码中,我们使用了Flagstd::regex_constants::icase来忽略大小写。该代码将输出“Match Found: World”。

不匹配子表达式

下面是一个例子:

#include <regex>
#include <iostream>

int main()
{
    std::string str = "Hello World!";
    std::regex regexPattern("[a-zA-Z]+(\\s[a-zA-Z]+)?", std::regex_constants::nosubs);
    bool is_match = std::regex_match(str, regexPattern);
    std::cout << "Is Match: " << (is_match ? "True" : "False") << std::endl;
    return 0;
}

在上面的代码中,我们使用了Flagstd::regex_constants::nosubs来不匹配子表达式。该Regex模式将匹配任何包含一个或两个字母的单词。

优化

下面是一个例子:

#include <regex>
#include <iostream>

int main()
{
    std::string str = "Hello World!";
    std::regex regexPattern("[a-zA-Z]+(\\s[a-zA-Z]+)?", std::regex_constants::optimize);
    bool is_match = std::regex_match(str, regexPattern);
    std::cout << "Is Match: " << (is_match ? "True" : "False") << std::endl;
    return 0;
}

在上面的代码中,我们使用了Flagstd::regex_constants::optimize来对Regex模式进行优化。该Regex模式将匹配任何包含一个或两个字母的单词。

总结

在C++中,Regex是一种非常有用的工具,它可以帮助我们搜索、匹配和替换字符串。本文介绍了Regex的语法、std::regex_matchstd::regex_replace函数以及它们的Flag。Regex可以让我们写出更加灵活和强大的代码。