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++?