0

一部のサンプル入力

当選番号:1
当選番号:1、2、3、4
当選番号:1、23、28、273、191

希望する試合

[1]
[1,2,3,4]
[1,23,28,273,191]

単純なパターンですが、すべての数字をどのように一致させるかはよくわかりません。「最初の数字を取得してから、カンマと場合によってはスペースを前に付けた0個以上の数字を取得する」などのことを考えていました。

winning numbers:\s*(\d+)\s*(,\s*(\d+))*

ただし、最初の番号(予想どおり)と最後の番号にのみ一致します。

私はrubyを使用しているので、配列内のすべての一致を取得して渡すことができるようにしたいと思います。私の現在の正規表現では、最後の数字と一致しますが、括弧内にあるため、コンマとも一致します。

私のロジックに欠陥がありますか?それとも、正規表現として正しく表現していませんか?正規表現をテストするためにrubular
を 使用しています。

4

2 に答える 2

4

メソッドを使用scanしてすべての数値を照合し、次にmapそれらを配列に変換し、を使用して各数値を整数に変換できます。to_i

numbers = "1,23, 28,   273, 191"

numbers.scan(/\d+/).map(&:to_i)
 => [1, 23, 28, 273, 191]
于 2012-05-12T23:59:35.447 に答える
0

元の答えはうまくいきますが、いつか誰かがメッセージテキストを変更して数字を含めるようになるのではないかといつも心配しています。

これを行う別の方法は次のとおりです。

2.3.0 :013 > def get_numbers(s)
2.3.0 :014?>   s.split(':').last.split(',').map(&:to_i)
2.3.0 :015?>   end
 => :get_numbers
2.3.0 :016 > get_numbers 'winning numbers: 1,23, 28,   273, 191'
 => [1, 23, 28, 273, 191]

もちろん、これには、行に常に正確に1つのコロンがあり、説明テキストが終了するという仮定も含まれています。

于 2016-05-23T11:26:16.923 に答える