首页 > 解决方案 > 为什么正则表达式在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 代码创建了正确的结果。为什么会出现这种情况,问题出在哪里?

标签: javac++regex

解决方案


你是对的。您的示例不适用于 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;
}

推荐阅读