【问题标题】:Extract numbers from a 1 line string using regex使用正则表达式从 1 行字符串中提取数字
【发布时间】:2021-05-18 15:24:04
【问题描述】:

我有一个如下所示的单行字符串:

{"took":125,"timed_out":false,"_shards":{"total":10,"successful":10,"skipped":0,"failed":0}}{"took":365,"timed_out":false,"_shards":{"total":10,"successful":10,"skipped":0,"failed":0}}{"took":15,"timed_out":false,"_shards":{"total":10,"successful":10,"skipped":0,"failed":0}}

我想提取“took”部分之后的所有数字,所以在我的例子中,输出如下所示:

125
365
15

到目前为止,我尝试使用 took":(\d{1,6}),"(.*) 作为正则表达式。但由于它是一个单行字符串,它只提取第一个出现而忽略其他的。

【问题讨论】:

  • 您可以使用此模式获取数字"took":\K\d+
  • 或者,找到took":(\d+)|(?s)(?:(?!took":\d).)*并替换为(?{1}$1\n)
  • @WiktorStribiżew 这是一个有趣的查找/替换条件。
  • @WiktorStribiżew 谢谢它很好用!如果您不介意解释答案背后的逻辑,我很乐意接受它作为答案。

标签: regex notepad++


【解决方案1】:

你可以使用

查找内容:      took":(\d+)|(?s)(?:(?!took":\d).)*
替换为(?{1}$1\n)

详情

  • took": - 文字文本
  • (\d+) - 一个或多个数字被捕获到第 1 组
  • | - 或
  • (?s) - 设置 DOTALL 模式(. 现在匹配换行符)
  • (?:(?!took":\d).)* - 任何不以took": + 数字字符序列开头的单个字符,0 次或多次,尽可能多。

(?{1}$1\n) 条件替换模式就是这样替换的:

  • (?{1} - 如果组 1 匹配
    • $1\n - 将匹配替换为第 1 组和换行符
  • ) - 否则,替换为空字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-17
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 2011-05-10
    • 2011-12-05
    相关资源
    最近更新 更多