正如話題所示,是否有可能使這些正則表達式更短?我正在使用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+
,但同樣這會導致頭痛,如果你的代碼實際上使用這些羣體中提取信息。
下可能不會短(如果算上鍵入它需要的字符數),但它是一個很大的可讀性:
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+'))
不知道,但這使我更難以閱讀......它可能適用於簡單的正則表達式,但對於複雜的正則表達式,更難推理它。 – nhahtdh
對我而言恰恰相反。我可以閱讀簡單的正則表達式:s,但是一旦他們開始填充幾行內容,我的內部解析器就會溢出......將它們分成更小的組使得它們對我來說更容易閱讀。 – Lindydancer
那麼,如果令牌有意義(語義明智),那麼它是好的(我這樣寫一些非常長的正則表達式)。在這種情況下,它在語義上不是很有意義。 – nhahtdh
如果是這樣,你需要處理的唯一文件那麼您可以手動刪除不必要的數據,然後逐行讀取文件,以空格字符\s+
分隔並選取列。
即使沒有手動刪除不必要的數據,也可以逐行讀取原始文件,拆分\s+
,並測試前幾個條目是否爲數字。這正是你正在用正則表達式(測試格式和提取符合格式的數據)。
注意[\s&&[^\n]\S]
手段相交\s
和[^\n]\S
,這會導致集:所有空格字符但新線。所以我們可以把它改寫成[\s&&[^\n]]
。然而,[\S\s&&[^\n]]
意味着相交\S\s
和[^\n]
,結果集:所有字符但新行。等效重寫爲.
或[^\n]
,但我懷疑這是你的意思。由於惰性量詞,結果對於當前輸入仍然是正確的,但它可能不適用於錯誤的輸入。
另一件事是.
將意味着文字.
裏面的字符類,所以[\d.]
相當於[\d\.]
。
你基本上是想分裂一個固定寬度列的網頁嗎?
正則表達式是一種方式。您可能對固定寬度列方法感興趣:
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
}
它是做什麼的? –
檢索這裏的三個第一列www.ida.liu.se/~TDP007/material/seminarie2/weather.txt –
如果它起作用,爲什麼要縮短它? –