首页 > 解决方案 > NAPI:如何匹配来自 C++ 线程的 JS 正则表达式?

问题描述

我正在修改一个 Node 本机扩展,它产生本机线程来进行一些处理。我的问题是我想让 Javascript 代码为处理提供一个过滤器以排除一些数据。

在这一点上,我将一个 JS RegExp 字符串从 JS 传递到 C++,std::regex从中创建一个实例,并将它传递给不同的结构,向下传递到本机线程逻辑。

我现在的问题是,尽管std::regex使用的语法似乎与 ECMAScript 正则表达式相同,但行为并不相同 :(

我最初的计划是以某种方式依赖 V8 的 RegExp 引擎,但直接触发 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++ 中相同的结果?是否可以从纯 C++ 上下文运行 V8 的 RegExp?

标签: c++regexnode-native-addon

解决方案


推荐阅读