为什么正则表达式在Java中能很好地工作,而在C ++中却不能工作?

时间:2019-03-26 08:33:33

标签: java c++ regex

使用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代码创建了正确的结果。为什么会发生这种情况,问题出在哪里?

1 个答案:

答案 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;
}