0

私は Ruby の初心者で、助けが必要です。.txt のサンプル部分があります。

Modified : /Analitics/Documents/HTZ/BR-5545 Credit/Example BR-5545.docx
Modified : /Analitics/Documents/HTZ/BR-5545 Credit/HTZ BR-5545 Example.docx

行内の数字のみを検索する必要があり、一度だけ検索する必要があります。(一度だけ現れる一意の数字のセット) 正規表現で数字を見つける

line=~/(BR-\d*)/
my=line.scan(/(BR-\d*)/)

出力:

`[["BR-5545"], ["BR-5545"]]`

しかし、私は一度必要です:

`[["BR-5545"]`

正規表現を変換する方法を教えてください

4

3 に答える 3

3

uniq!スキャン後に追加するだけです:

data = "Modified : /Analitics/Documents/HTZ/BR-5545 Credit/Example BR-5545.docx"
data.scan(/(BR-\d*)/).uniq! # [["BR-5545"]
于 2013-06-25T12:10:57.270 に答える
2

配列の代わりにセットを使用します。

require 'set'
lines=[
    'Modified : /Analitics/Documents/HTZ/BR-5545 Credit/Example BR-5545.docx',
    'Modified : /Analitics/Documents/HTZ/BR-5545 Credit/HTZ BR-5545 Example.docx'
]

lines.inject(Set.new) {|s, l| s.merge(l.scan(/BR-\d+/)); s}
# => #<Set: {"BR-5545"}>

# or as an array
lines.inject(Set.new) {|s, l| s.merge(l.scan(/BR-\d+/)); s}.to_a
# => ["BR-5545"]
于 2013-06-25T17:09:37.127 に答える
1

次のようなファイルがあるとしinput.txtます。

Modified : /Analitics/Documents/HTZ/BR-5545 Credit/Example BR-5545.docx
Modified : /Analitics/Documents/HTZ/BR-5545 Credit/HTZ BR-5545 Example.docx

これで欲しいものを手に入れることができます

File.open('input.txt').inject([]) do |array, line|
  array << line.scan(/(BR-\d*)/)
end.flatten.uniq

基本的:

  • ファイルを開きます
  • 反復の結果を変数に注入し始めます。変数は次のarrayように初期化されます。[]
  • 各行をスキャンして、目的の正規表現を探します
  • すべての結果を収集した後、1 次元配列になるようにフラット化します
  • 次に、重複を削除するために uniq を呼び出します
于 2013-06-25T12:31:00.707 に答える