【问题标题】:PCRE implementing negative lookahead AND behind working together?PCRE 实施负前瞻和共同工作?
【发布时间】: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) (?&lt;![\'"]) (\w+) (?![\'"]) :~mx'
  • 哇。我花了大约 3 个小时试图弄清楚如何解决这个问题,而你,Wiktor,只需要一分钟就可以解决它。让我非常感谢你!

标签: regex conditional pcre lookahead lookbehind


【解决方案1】:

您混合了前瞻和后视位置。

(?![\'"])(\w+) 等于(\w+),因为(?![\'"]) 是一个负前瞻,并且要求下一个字符不是'",而是因为下一个模式是\w,匹配一个单词char,前瞻就变得多余了。您需要在此处使用负面的后视,(?&lt;![\'"]) (\w+)(\w+)(?&lt;![\'"]) 的问题也是类似的:char 不能是 '",负面的后视是多余的。你想要一个前瞻

你需要使用

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

请参阅regex demo

【讨论】:

    【解决方案2】:

    正如 Wiktor 在 cmets 中对我最初的问题所发布的,这就是解决方案:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      • 2015-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-27
      • 2015-04-23
      相关资源
      最近更新 更多