Почему регулярное выражение хорошо работает в Java, но не работает в C ++? - PullRequest
0 голосов
/ 26 марта 2019

с использованием 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 Ответ

1 голос
/ 26 марта 2019

Вы правы.Ваш пример не работает на 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] на .*.

В ответ на дальнейший запросизолировать часть строки «ОК», что делается с помощью групп.Группа [0] всегда полностью совпадает.группа [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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...