トピックが示唆するように、これらの正規表現を短くすることは可能ですか? 私はRuby 1.9.3を使用しています
/\n\s+(\w{0,3})[\s&&[^\n]\S]+?([\d\.]+)[\S\s&&[^\n]]+?([\d\.]+)/
この
/\s+(\w+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+-*\s+(\d+)\s+(\d+)\s+/
ありがとう!
トピックが示唆するように、これらの正規表現を短くすることは可能ですか? 私はRuby 1.9.3を使用しています
/\n\s+(\w{0,3})[\s&&[^\n]\S]+?([\d\.]+)[\S\s&&[^\n]]+?([\d\.]+)/
この
/\s+(\w+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+-*\s+(\d+)\s+(\d+)\s+/
ありがとう!
/\n\s+(\w{0,3})[\s&&[^\n]\S]+?([\d\.]+)[\S\s&&[^\n]]+?([\d\.]+)/
ルビの正規表現を正しく理解していれば[\s&&[^\n]\S]
、文字は空白文字であり、空白文字以外の文字であるか、改行ではないことを意味します。文字を空白文字と非空白文字の両方にすることはできないため、おそらく[\s&&[^\n]]
.
かっこを削除することもできます(\w{0,3})
が\w{0,3}
、後でコードでこれらのグループの文字を使用しようとしている場合は、使用しないでください。
/\s+(\w+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+-*\s+(\d+)\s+(\d+)\s+/
ステートメントの一部を組み合わせることができますが\s+\w+(\s+\d+){5}\s+-*(\s+\d+){2}\s+
、コードが実際にそれらのグループを使用して情報を抽出する場合、これも頭痛の種になります。
基本的に、固定幅の列の Web ページを分割することを目指していますか?
正規表現は一方向です。固定幅列のアプローチに興味があるかもしれません:
uri = URI.parse 'http://www.ida.liu.se/~TDP007/material/seminarie2/weather.txt'
page = uri.read
rows = page.split(/\n/)[9..-3]
rows.each{|r|
day, max, mnt = r[0..3].strip, r[4..11].strip, r[12..17].strip
}
それが処理する必要がある唯一のファイルである場合は、不要なデータを手動で削除してから、ファイルを行ごとに読み取り、スペース文字で分割\s+
して列を選択できます。
手動で不要なデータを削除しなくても、元のファイルを 1 行ずつ読み取り、 で分割して\s+
、最初のいくつかのエントリが数値であるかどうかをテストすることもできます。これはまさに正規表現でも行っていることです(フォーマットをテストし、フォーマットに一致するデータを抽出します)。
とが[\s&&[^\n]\S]
交差することを意味することに注意してください。これにより、すべてのスペース文字が改行されます。したがって、 に書き換えることができます。ただし、は と の交差を意味し、改行を除くすべての文字がセットになります。同等の書き直しはorですが、これがあなたの言っていることとは思えません。遅延量指定子により、結果は現在の入力に対しては依然として正しいですが、不適切な入力に対してはそうではない可能性があります。\s
[^\n]\S
[\s&&[^\n]]
[\S\s&&[^\n]]
\S\s
[^\n]
.
[^\n]
もう 1 つのことは、文字クラス内.
のリテラルを意味するため、と同等です。.
[\d.]
[\d\.]
以下は短くはないかもしれませんが (入力に必要な文字数を数えれば)、はるかに読みやすくなっています:
arr = ['(\w+)'] # Match a word
arr += ['(\d+)']*5 # Match five numbers
arr += ['-*'] # ignore dashes
arr += ['(\d+)']*2 # Match two numbers
# All of the above separated with space, plus space before and after.
my_regexp = Regexp.new(([''] + arr + ['']).join('\s+'))