【问题标题】:Fetch comma separated numbers by regex通过正则表达式获取逗号分隔的数字
【发布时间】:2022-01-08 05:32:14
【问题描述】:

我需要使用 Ruby String#match 方法从特定格式的字符串中获取逗号分隔的整数:

'text PaymentID: 12345'.match(PATTERN)[1..-1]          # expected result: ['12345']
'text Payment ID: 12345'.match(PATTERN)[1..-1]         # expected result: ['12345']
'text Payment id 12345'.match(PATTERN)[1..-1]          # expected result: ['12345']
'text paymentid:12345'.match(PATTERN)[1..-1]           # expected result: ['12345']
'text payment id: 12345'.match(PATTERN)[1..-1]         # expected result: ['12345']
'text payment ID: 111,999'.match(PATTERN)[1..-1]       # expected result: ['111', '999']
'text payment ID: 111, 222, 333'.match(PATTERN)[1..-1] # expected result: ['111', '222', '333']

所以所有空格和':'符号都是可选的,模式应该不区分大小写,payment 之前的文本可以包含任何字符。 我的最后一个变种不够好:

PATTERN = /payment[\s]?id[:]?[\s]?(\d+)(?:[,]?[\s]?(\d+))+/i

> 'text Payment id: 12345'.match(PATTERN)[1..-1]
=> ["1234", "5"]
> 'text Payment id: 12345, 333, 91872389'.match(PATTERN)[1..-1]
=> ["12345", "91872389"]

关于如何实现这一目标的任何想法?提前致谢。

【问题讨论】:

  • 为什么不text.scan(/\d+/)?或者text.scan(/(?:\G(?!\A)\s*,|payment\s?id:?)\s*\K\d+/i)
  • @WiktorStribiżew payment 单词之前的文本可以包含任何字符,包括数字。问题已更新,抱歉。我将测试第二个正则表达式,它看起来适合我的需要。

标签: regex ruby


【解决方案1】:

你可以使用

text.scan(/(?:\G(?!\A)\s*,|payment\s?id:?)\s*\K\d+/i)

正则表达式匹配

  • (?:\G(?!\A)\s*,|payment\s?id:?) - 上一个成功匹配的结尾,然后是零个或多个空格和一个逗号或payment,一个可选的空格,id 和一个可选的冒号
  • \s* - 零个或多个空格
  • \K 从比赛中删除刚刚消耗的内容
  • \d+ - 一位或多位数字。

【讨论】:

    【解决方案2】:

    您不能重复捕获组,因为最后一次出现将覆盖前一次。您可以做的是使用基于\G 的模式,以确保连续匹配之间的连续性与扫描方法:

    PATTERN = /(?:(?!\A)\G\s*,|payment\s*id\s*:?)\s*(\d+)/i
    
    'text Payment id: 12345, 333, 91872389'.scan(PATTERN).flatten
    

    简而言之,第二个分支payment\s*id\s*:? 必须首先成功,以允许第一个分支(?!\A)\G\s* 在接下来的匹配中成功。

    【讨论】:

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