假设我有一个字符串:String1/String2/String3/String4
我想使用正则表达式查找斜杠字符之间的所有匹配以及最后一个/
字符后的所有内容。所以输出将是:String2 , String3 , String4
smatch match_str;
regex re_str("\\/(.*)");
regex_match( s, match_str, re_str );
cout << match_str[1] << endl;
cout << match_str[2] << endl;
cout << match_str[3] << endl;
答案 0 :(得分:1)
请注意,regex_match
需要完整的字符串匹配。此外,.*
尽可能多地匹配除换行符之外的0个或多个字符(也就是说,它匹配到给定行的最后一行)。
此外,C ++正则表达式中的/
符号不需要转义。
这是一个有效的代码:
#include <string>
#include <iostream>
#include <regex>
using namespace std;
int main() {
std::regex r("[^/]+");
std::smatch m;
std::string s = "String1/String2/String3/String4";
for(std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), r);
i != std::sregex_iterator();
++i )
{
std::smatch m = *i;
std::cout << m[0] << '\n';
}
return 0;
}
请参阅IDEONE demo
结果:
String1
String2
String3
String4
如果需要指定初始边界,请使用
std::regex rex1("(?:^|/)([^/]+)");
值将在m[1]
内,而不是m[0]
。请参阅another demo。
答案 1 :(得分:0)
答案 2 :(得分:0)
这是使用字符串迭代器(未经测试)的方法。
std::string strInput = "String1/String2/String3/String4";
std::string::const_iterator start = strInput.begin();
std::string::const_iterator end = strInput.end();
std::smatch _M;
std::regex Rx( "/([^/]*)" );
while ( regex_search( start, end, _M, Rx ) )
{
std::string strSubDir = _M[1].str(); // Do something with subdir
cout << strSubDir.c_str() << endl; // Debug print subdir
start = _M[0].second; // Advance the start iterator past this match
}
输出:
String2
String3
String4