📅  最后修改于: 2023-12-03 15:30:06.712000             🧑  作者: Mango
正则表达式是一种强大的文本匹配工具,可以用于快速匹配一定规则的字符串。在 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;
}
# 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;
}