使用c ++
std::regex reg("[\\s\\S]*abc[\\s\\S]*:(\\S+)");
std::string src = " abc-def gg, :OK";
std::smatch match;
bool flag = std::regex_search(src, match, reg);
// flag is false
使用Java
Pattern p = Pattern.compile("[\\s\\S]*abc[\\s\\S]*:(\\S+)");
String src = " abc-def gg, :OK";
Matcher m = p.matcher(src);
int num = 0;
while (m.find()) {
for (int i = 1; i <= m.groupCount(); i++) {
num++;
}
}
System.out.println(num); num is 1 ,work well
在上面的两个代码示例中,C ++代码没有输出正确的结果,但是Java代码创建了正确的结果。为什么会发生这种情况,问题出在哪里?
答案 0 :(得分:1)
您是正确的。您的示例在Mac OS上不起作用。如果在Mac上运行它,我也会遇到同样的问题。
您的最终评论是“如何使其在MAC OS中运行”,我猜这是在询问使该功能在Mac上运行的代码,而不是在问为什么两个正则表达式实现会产生不同的结果。这是一个简单得多的解决方案:
这在我的Mac上有效:
#include <iostream>
#include <regex>
#include <string>
using namespace std;
int main() {
// std::regex reg("[\\s\\S]*abc[\\s\\S]*:(\\S+)");
std::regex reg("[\\s\\S]*abc.*:(\\S+)");
std::string src = " abc-def gg, :OK";
std::smatch match;
bool flag = std::regex_search(src, match, reg);
std::cout << flag;
return 0;
}
在regex101.com上运行的相同表达式在Mac(llvm)上不起作用。看来[\ s \ S]在Mac的正则表达式库中无法正常运行,但是可以通过用.*
替换[\ s \ S]来解决。
响应于进一步查询以隔离字符串的“ OK”部分,这是使用组完成的。组[0]始终是整个匹配项。 group [1]是括号(...)
此代码说明了如何提取两个组。请接受答案。
#include <iostream>
#include <regex>
#include <string>
using namespace std;
std::string GetMatch() {
// std::regex reg("[\\s\\S]*abc[\\s\\S]*:(\\S+)");
std::regex reg("[\\s\\S]*abc.*:(\\S+)");
std::string src = " abc-def gg, :OK";
std::smatch matches;
bool flag = std::regex_search(src, matches, reg);
std::cout << flag;
for(size_t i=0; i<matches.size(); ++i) {
cout << "MATCH: " << matches[i] << endl;
}
return matches[1];
}
int main() {
std::string result = GetMatch();
// match
cout << "The result is " << result << endl;
return 0;
}