【问题标题】:How to capture a repeating optional value如何捕获重复的可选值
【发布时间】:2017-10-11 21:54:04
【问题描述】:

我所有在“”之前捕获所有内容的尝试都只返回最后一次出现。我有以下几个源字符串示例。

{"rec_timestamp": "2016-12-25T11:43:38.763-0700","151521": "-18.788","151515": "25","151522": "2.804","151520": "3506","151523": "-18.4","11124": "NO_DEFECT|","151516": "0","151510": "ALCLFA2BA314","151518": "3.28","151519": "24.398438","": "","": "","": "","": ""}
{"rec_timestamp": "2016-12-25T11:43:38.763-0700","151521": "-18.788","151515": "25","151522": "2.804","151520": "3506","151523": "-18.4","11124": "NO_DEFECT|","151516": "0","151510": "ALCLFA2BA314","151518": "3.28","151519": "24.398438"}

所以对于第一条记录,我最多将 ..."24.398438" 返回到 $1 ("" 之前的所有内容),第二个示例按原样返回整行(,'' 是可选的)?

我试过了:

(^.*)(,""*?)
(^.*)(,"".*)

【问题讨论】:

  • 喜欢这个? regex101.com/r/LNHYOY/2
  • 输入字符串看起来像有效的 JSON。您是否有任何理由不能使用 JSON 解码函数来恢复编码的数据结构并从中获取值?

标签: regex


【解决方案1】:

使用您使用的语言,正则表达式默认是贪婪的:.* 部分希望尽可能长时间地匹配。您可以通过将 .* 替换为 .*? 来使正则表达式变得不贪心(它希望匹配尽可能少的字符)。

在这里,您的子字符串由开头的行首和行尾的字符 ,"" 或字符 } 分隔。有了这样的东西,你会得到一个标准化的匹配(省略} 字符)

^(.+?)(,"".*|\}$)

如果您不需要捕获第二部分,则可以使用断言代替。

^(.+?)(?=,""|\}$)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 2015-04-03
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    相关资源
    最近更新 更多