【发布时间】: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单词之前的文本可以包含任何字符,包括数字。问题已更新,抱歉。我将测试第二个正则表达式,它看起来适合我的需要。