PCRE 实施负先行和落后合作?

PCRE implementing negative lookahead AND behind working together?

大家好,

我遇到了一个显然无法解决的问题。它涉及 PCRE 实施应该(但显然不)一起工作的负前瞻和落后条件。

我想要完成的事情:

我有一个包含符合 JavaScript 语法的常量的字符串。此字符串的语法需要转换以符合 JSON 标准。

我遇到的问题:

当我尝试用引号封装对象 属性 键时,我需要从数组中包含的字符串中区分 "real" 属性 键,这恰好看起来像 属性键。

示例输入(所有 JS):

const Const = {
  propertyKeyA: "someValue",
  propertyKeyB: ["ThisIsMyHeadache:ItShouldNotBeChanged"]
};

期望的输出:

{
  "propertyKeyA": "someValue",
  "propertyKeyB": ["ThisIsMyHeadache:ItShouldNotBeChanged"]
}

我的 PCRE 方法:

$output = preg_replace(
  '~(?:^|\b)    (?![\'"])  (\w+)  (?<![\'"])     :~mx',
  '"":',
  $input
);

这导致:

{
  "propertyKeyA": "someValue",
  "propertyKeyB": [""ThisIsMyHeadache":ItShouldNotBeChanged"]
}

注意数组定义中的双引号。在我看来好像条件根本不起作用。

有没有人知道如何解决这个问题?非常感谢

最好的, 克里斯

您混合了前瞻和后视位置。

(?![\'"])(\w+) 等于 (\w+) 因为 (?![\'"]) 负前瞻 并且要求下一个字符不是 '",但由于下一个模式是 \w,匹配单词 char,前瞻变得多余。你需要在这里使用负面回顾,(?<![\'"]) (\w+)(\w+)(?<![\'"]) 的问题是相似的:char 不能是 '" 并且负向后视是多余的。你想要先行

你需要使用

'~(?:^|\b) (?<![\'"]) (\w+) (?![\'"]) :~mx'

参见regex demo

正如 Wiktor 在对我最初问题的评论中所发表的,这是解决方案:

'~(?:^|\b) (?<![\'"]) (\w+) (?![\'"]) :~mx'