我需要使用 RubyString#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"]
關于如何實作這一目標的任何想法?提前致謝。
uj5u.com熱心網友回復:
您可以使用
text.scan(/(?:\G(?!\A)\s*,|payment\s?id:?)\s*\K\d /i)
正則運算式匹配
(?:\G(?!\A)\s*,|payment\s?id:?)- 前一個成功匹配的結尾,然后是零個或多個空格和一個逗號 orpayment、一個可選的空格id和一個可選的冒號\s*- 零個或多個空格\K從比賽中洗掉剛剛消耗的東西\d- 一位或多位數字。
uj5u.com熱心網友回復:
您不能重復捕獲組,因為最后一次出現將覆寫前一次。您可以做的是使用\G基于模式的模式,以確保與 scan 方法的連續匹配之間的連續性:
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*在下一場比賽中成功。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/373357.html
