java - 为什么正则表达式在java中运行良好,但在c ++中不起作用?
问题描述
使用 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 代码创建了正确的结果。为什么会出现这种情况,问题出在哪里?
解决方案
你是对的。您的示例不适用于 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”部分,这是使用组完成的。group[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;
}
推荐阅读
- python - 平滑像素化二进制图像python代码的边缘
- java - Javax WS上没有注释错误的多个参数,当我使用“suspend”时进行改造,如何处理?
- python - 尝试使用 os.rename 时出现 FileNotFoundError
- relay - 如何在参数定义中将今天的日期作为默认值 createFragmentContainer 传递
- java - 从文件中解析Java中的JSON
- ethereum - 仲裁中的公共交易卡在交易池中待处理
- r - 订购图例标签而不是向下?
- javascript - 如何在 map 函数中重用对象?
- c# - Group By 除了实例化一个类
- javascript - 如何限制我的基于 JS 浏览器的 API 应用程序?