我有一个我显然无法解决的问题。它涉及PCRE实施负面的前瞻和落后条件,这些条件应该(但显然不能)一起工作。
我有一个包含符合JavaScript语法的常量的字符串。该字符串的语法需要转换为遵循JSON标准。
当我尝试用引号将对象属性键封装起来时,我需要从数组中包含的字符串中区分出“真实的”属性键,而它们恰好看起来像属性键。
const Const = {
propertyKeyA: "someValue",
propertyKeyB: ["ThisIsMyHeadache:ItShouldNotBeChanged"]
};
{
"propertyKeyA": "someValue",
"propertyKeyB": ["ThisIsMyHeadache:ItShouldNotBeChanged"]
}
$output = preg_replace(
'~(?:^|\b) (?![\'"]) (\w+) (?<![\'"]) :~mx',
'"\1":',
$input
);
导致:
{
"propertyKeyA": "someValue",
"propertyKeyB": [""ThisIsMyHeadache":ItShouldNotBeChanged"]
}
请注意数组定义中的双引号。在我看来,条件根本不起作用。
有人对如何解决这个问题有想法吗?非常感谢!
最好, 克里斯
答案 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);
}