【问题标题】:[.\s]* is ignoring the dot?[.\s]* 忽略点?
【发布时间】:2014-10-18 05:20:33
【问题描述】:

我正在尝试匹配某个字符串化 json 中的对象(因为一些不幸的特定于服务器的 PHP 限制)。

我的尝试:/\{\s*"first":"first_entry_match"[.\s]*?\}/

这应该匹配 json 中第一个参数为“first”且对应值为“first_entry_match”的任何对象。在玩了之后,我发现 . 不起作用 - 使用 [\s\w":,] 走得很远,但我可能最终会处理一些 unicode 并想简单地匹配 everything 直到我看到了第一个}

JSFiddle(我使用的是 PHP,但这说明了问题。请注意,在我的例子中,我的 json 字符串中有换行符)

【问题讨论】:

  • 这是在 JavaScript 中解析的吗?如果是这样,您是否知道可以将“reviver”函数传递给JSON.parse,从而轻松定位每个"first" 字段?我无法想象您实际上需要在整个 JSON 结构上使用正则表达式。
  • 你真的想直接转到第一个}吗?这不适用于{"first":"first_entry_match","second":{"x":"y"}} 之类的东西。
  • 所有值都是字符串,所以@TedHopp 不会成为问题。
  • @cookiemonster 我完全使用javascript。只是没有 json_decode 或 json_encode 函数的 PHP
  • 如果所有值都是字符串,那么 Avinash 的答案就是要走的路(前提是保证所有字符串都不包含 } 字符)。

标签: php regex json


【解决方案1】:

要将所有字符匹配到第一个 } 符号,请使用带有符号 } 的否定字符类,即。 [^}]*

/\{\s*"first":"first_entry_match"[^}]*\}/

DEMO

【讨论】:

    【解决方案2】:

    就用这个吧:

    /\{\s*"first":"first_entry_match".*?\}/
    

    .*? 确保选择中没有}。 (非贪婪)

    http://jsfiddle.net/DerekL/dbangys1/1/

    【讨论】:

    • 正如我所说,我的实际 JSON 中有换行符。
    • @lucasem 如果您正在运行 php,则此正则表达式应更改为 (?s)\{\s*"first":"first_entry_match".*?\} 以匹配换行符。
    【解决方案3】:

    您已将点放在括号中。点在括号外表示每个字符,在括号内,它只是表示点字符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多