PCRE实施负面前瞻和合作背后?

问题描述 投票:1回答:2

Hi all,

我有一点问题,我显然无法解决。它涉及PCRE实施负面前瞻和后面条件,应该(但显然不)一起工作。

What I'm trying to accomplish:

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

The problem I encounter:

当我尝试用引号封装对象属性键时,我需要将“真实”属性键与数组中包含的字符串区分开来,这看起来像属性键。

Example input (all JS):

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

Desired output:

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

My PCRE approach:

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

这导致:

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

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

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

最好,克里斯

regex conditional pcre lookahead lookbehind
2个回答
1
投票

你混合前瞻和后仰位置。

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

你需要使用

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

regex demo


0
投票

Wiktor在我的初步问题的评论中发布,这是解决方案:

'~(?:^|\b) (?<![\'"]) (\w+) (?![\'"]) :~mx'
© www.soinside.com 2019 - 2024. All rights reserved.