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

时间:2019-02-18 18:15:05

标签: regex conditional pcre lookahead lookbehind

大家好,

我有一个我显然无法解决的问题。它涉及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"]
}

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

有人对如何解决这个问题有想法吗?非常感谢!

最好, 克里斯

2 个答案:

答案 0 :(得分:1)

您混合了先行和后进位置。

(?![\'"])(\w+)等于(\w+),因为(?![\'"])负向超前,并且要求下一个字符不是'或{ {1}},但是由于下一个模式是",与单词char匹配,所以超前变得多余。您需要在此处\w后面使用否定性。并且(?<![\'"]) (\w+)的问题是相似的:char单词不能是(\w+)(?<![\'"])'并且后面的负向是多余的。您想要在这里前瞻

您需要使用

"

请参见regex demo

答案 1 :(得分:0)

Wiktor在对我的第一个问题的评论中发布了以下解决方案:

function onSubCatChange() {
    // Both following methods work to get list o checked items
    var names = [];
    $('#cblSubCategory input:checked').each(function() {
        names.push(this.value);
    });

    var names2 = $('#cblSubCategory input:checked').map(function () {
        return this.value;
    }).get();

    bindDataTable(names);
}