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'
大家好,
我遇到了一个显然无法解决的问题。它涉及 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'