NAPI: как сопоставить регулярное выражение JS из потока C++?

Я модифицирую собственное расширение Node, которое порождает собственные потоки для некоторой обработки. Моя проблема в том, что я хотел бы, чтобы код Javascript предоставлял фильтр для обработки, чтобы исключить некоторые данные.

На этом этапе я передаю строку JS RegExp из JS в C++, создавая std::regex из него и передавая его по различным структурам вплоть до логики собственного потока.

Моя проблема сейчас в том, что, несмотря на std::regex используя тот же синтаксис, что и регулярные выражения ECMAScript, поведение не то же самое:(

Мой первоначальный план состоял в том, чтобы каким-то образом полагаться на механизм RegExp V8, но запускать биты C++ напрямую, а не переходить с C++ на JS и обратно. Но я не мог найти, как это сделать.

В качестве примера посмотрите следующие программы, использующие одно и то же регулярное выражение, но дающие разные результаты:

#include <stdio.h>
#include <regex>

int main() {
  std::regex re("^(?:(?:(?!(?:\\/|^)\\.).)*?\\/c)$");
  std::smatch match;
  std::string input("a.b/c");
  int result = std::regex_match(input, match, re);
  if (result == 1) {
    printf("ok");
  } else {
    printf("nok");
  }
  return 0;
}

Эквивалентный код JS:

const re = new RegExp("^(?:(?:(?!(?:\\/|^)\\.).)*?\\/c)$");
const match = re.exec("a.b/c");
if (match) {
  console.log("ok");
} else {
  console.log("nok");
}

Тогда мой вопрос: что я могу сделать, чтобы получить те же результаты, что и на JS, но на C++? Можно ли запустить RegExp V8 из чистого контекста C++?

0 ответов

Другие вопросы по тегам