【发布时间】:2019-02-18 18:15:04
【问题描述】:
大家好,
我遇到了一些我显然无法解决的问题。它涉及 PCRE 实现应该(但显然不)一起工作的负前瞻和后置条件。
我想要完成的工作:
我有一个字符串,其中包含一个符合 JavaScript 语法的常量。此字符串的语法需要转换为符合 JSON 标准。
我遇到的问题:
当我尝试用引号封装对象属性键时,我需要将“真实”属性键与数组中包含的字符串区分开来,这恰好看起来像属性键。
示例输入(全 JS):
const Const = {
propertyKeyA: "someValue",
propertyKeyB: ["ThisIsMyHeadache:ItShouldNotBeChanged"]
};
期望的输出:
{
"propertyKeyA": "someValue",
"propertyKeyB": ["ThisIsMyHeadache:ItShouldNotBeChanged"]
}
我的 PCRE 方法:
$output = preg_replace(
'~(?:^|\b) (?![\'"]) (\w+) (?<![\'"]) :~mx',
'"\1":',
$input
);
导致:
{
"propertyKeyA": "someValue",
"propertyKeyB": [""ThisIsMyHeadache":ItShouldNotBeChanged"]
}
注意数组定义中的双引号。在我看来,这些条件根本不起作用。
有人知道如何解决这个问题吗?这将是非常感激!
最好, 克里斯
【问题讨论】:
-
(?![\'"])(\w+)没有意义,因为"和'不是单词字符,它等于(\w+)。你需要'~(?:^|\b) (?<![\'"]) (\w+) (?![\'"]) :~mx' -
哇。我花了大约 3 个小时试图弄清楚如何解决这个问题,而你,Wiktor,只需要一分钟就可以解决它。让我非常感谢你!
标签: regex conditional pcre lookahead lookbehind