📜  cpp 正则表达式匹配 - C++ (1)

📅  最后修改于: 2023-12-03 15:30:06.712000             🧑  作者: Mango

C++ 正则表达式匹配

正则表达式是一种强大的文本匹配工具,可以用于快速匹配一定规则的字符串。在 C++ 中,可以通过正则表达式库 <regex> 来实现文本匹配。

匹配基础

要使用正则表达式,首先需要了解一些基本的匹配规则,例如:

  • .:匹配任意一个字符(除了换行符);
  • []:匹配方括号中的任意一个字符;
  • [^]:匹配除了方括号中的任意一个字符以外的字符;
  • *:匹配前面的字符 0 次或多次;
  • +:匹配前面的字符 1 次或多次;
  • ?:匹配前面的字符 0 次或 1 次;
  • ():匹配括号中的表达式,并标记为子匹配;
  • |:匹配 | 左侧或右侧的表达式。

假设有一个字符串 str,想要匹配其中的所有数字字符,可以使用如下正则表达式:

regex num_reg("[0-9]+");

代码中的 [0-9]+ 表示匹配连续的数字字符。可以使用 regex_match() 函数来判断是否匹配成功:

string str = "abc123def456ghi789jkl";
regex num_reg("[0-9]+");
smatch results;
while (regex_search(str, results, num_reg)) {
    cout << results[0] << endl;
    str = results.suffix().str();
}

输出为:

123
456
789

代码中使用了 regex_search() 函数来进行匹配。该函数可以在目标字符串中依次寻找与正则表达式 num_reg 匹配的子字符串,每找到一组就将结果存储到 results 对象中。

输出时使用 results[0] 表示结果的第一组,即整个匹配结果。使用 results.suffix().str() 来取出未匹配部分,并更新目标字符串,从而能够继续匹配下一个结果。

匹配高级

除了基本的匹配规则外,正则表达式还支持一些高级功能,例如:

  • ^:匹配文本开头;
  • $:匹配文本结尾;
  • \b:匹配单词边界;
  • \d:匹配数字字符;
  • \D:匹配非数字字符;
  • \w:匹配字母、数字字符或下划线;
  • \W:匹配不是字母、数字字符或下划线的字符。

假设有一个字符串 str,想要匹配其中的所有 URL 地址,可以使用如下正则表达式:

regex url_reg("(https?|ftp)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]");

代码中的正则表达式是从 Stack Overflow 中找到的。它可以匹配以 http://https://ftp:// 开头的任意 URL 地址。

可以使用 regex_replace() 函数将匹配到的 URL 地址替换为指定的文本:

string str = "请访问我的网站:http://www.example.com 或者 https://www.example.com";
regex url_reg("(https?|ftp)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]");
string replace_str = "<a href=\"$&\">$&</a>";  // $& 表示匹配到的整个文本
string result = regex_replace(str, url_reg, replace_str);
cout << result << endl;

输出为:

请访问我的网站:<a href="http://www.example.com">http://www.example.com</a> 或者 <a href="https://www.example.com">https://www.example.com</a>
参考资料
代码片段
#include <iostream>
#include <regex>
#include <string>

using namespace std;

int main() {
    string str = "abc123def456ghi789jkl";
    regex num_reg("[0-9]+");
    smatch results;
    while (regex_search(str, results, num_reg)) {
        cout << results[0] << endl;
        str = results.suffix().str();
    }

    string str2 = "请访问我的网站:http://www.example.com 或者 https://www.example.com";
    regex url_reg("(https?|ftp)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]");
    string replace_str = "<a href=\"$&\">$&</a>";
    string result = regex_replace(str2, url_reg, replace_str);
    cout << result << endl;

    return 0;
}
Markdown 源码
# C++ 正则表达式匹配

正则表达式是一种强大的文本匹配工具,可以用于快速匹配一定规则的字符串。在 C++ 中,可以通过正则表达式库 `<regex>` 来实现文本匹配。

## 匹配基础

要使用正则表达式,首先需要了解一些基本的匹配规则,例如:

- `.`:匹配任意一个字符(除了换行符);
- `[]`:匹配方括号中的任意一个字符;
- `[^]`:匹配除了方括号中的任意一个字符以外的字符;
- `*`:匹配前面的字符 0 次或多次;
- `+`:匹配前面的字符 1 次或多次;
- `?`:匹配前面的字符 0 次或 1 次;
- `()`:匹配括号中的表达式,并标记为子匹配;
- `|`:匹配 `|` 左侧或右侧的表达式。

假设有一个字符串 `str`,想要匹配其中的所有数字字符,可以使用如下正则表达式:

```cpp
regex num_reg("[0-9]+");

代码中的 [0-9]+ 表示匹配连续的数字字符。可以使用 regex_match() 函数来判断是否匹配成功:

string str = "abc123def456ghi789jkl";
regex num_reg("[0-9]+");
smatch results;
while (regex_search(str, results, num_reg)) {
    cout << results[0] << endl;
    str = results.suffix().str();
}

输出为:

123
456
789

代码中使用了 regex_search() 函数来进行匹配。该函数可以在目标字符串中依次寻找与正则表达式 num_reg 匹配的子字符串,每找到一组就将结果存储到 results 对象中。

输出时使用 results[0] 表示结果的第一组,即整个匹配结果。使用 results.suffix().str() 来取出未匹配部分,并更新目标字符串,从而能够继续匹配下一个结果。

匹配高级

除了基本的匹配规则外,正则表达式还支持一些高级功能,例如:

  • ^:匹配文本开头;
  • $:匹配文本结尾;
  • \b:匹配单词边界;
  • \d:匹配数字字符;
  • \D:匹配非数字字符;
  • \w:匹配字母、数字字符或下划线;
  • \W:匹配不是字母、数字字符或下划线的字符。

假设有一个字符串 str,想要匹配其中的所有 URL 地址,可以使用如下正则表达式:

regex url_reg("(https?|ftp)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]");

代码中的正则表达式是从 Stack Overflow 中找到的。它可以匹配以 http://https://ftp:// 开头的任意 URL 地址。

可以使用 regex_replace() 函数将匹配到的 URL 地址替换为指定的文本:

string str = "请访问我的网站:http://www.example.com 或者 https://www.example.com";
regex url_reg("(https?|ftp)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]");
string replace_str = "<a href=\"$&\">$&</a>";  // $& 表示匹配到的整个文本
string result = regex_replace(str, url_reg, replace_str);
cout << result << endl;

输出为:

请访问我的网站:<a href="http://www.example.com">http://www.example.com</a> 或者 <a href="https://www.example.com">https://www.example.com</a>
参考资料
代码片段
#include <iostream>
#include <regex>
#include <string>

using namespace std;

int main() {
    string str = "abc123def456ghi789jkl";
    regex num_reg("[0-9]+");
    smatch results;
    while (regex_search(str, results, num_reg)) {
        cout << results[0] << endl;
        str = results.suffix().str();
    }

    string str2 = "请访问我的网站:http://www.example.com 或者 https://www.example.com";
    regex url_reg("(https?|ftp)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]");
    string replace_str = "<a href=\"$&\">$&</a>";
    string result = regex_replace(str2, url_reg, replace_str);
    cout << result << endl;

    return 0;
}