Re: [問題] Regexp 不方便的地方
※ 引述《lg31cm (30處男)》之銘言:
其實我一直覺得 Ruby 的標準程式庫缺少滿多小功能的
不過所幸的是大部份都可以藉由隨手寫的小程式來解決…
: 可能剛從 Python 轉過來沒多久,有些地方還不習慣,Ruby Regexp
: 有一點蠻不好用的:
: # Ruby
: /\w/.match(str)
: # Python
: re.match(str, begin_pos, end_pos)
: Ruby 似乎沒辦法指定搜尋的 range,當然這樣還是可以:
: /\w/.match(str[begin_pos..end_pos])
: 不過這就不是我要的東西了,因為傳回來的 matched position
: str[begin_pos..end_pos] 的子字串 matched position,而不是
: 原字串,有什麼好解決方案嗎?
剛剛隨手寫了這個,不知道能不能用
就只是簡單做位移運算而已
本來是想繼承 MatchData 來做的,不過不知道 MatchData 要怎麼 new @@
所以就暫時寫成這樣了…
class MatchRange
def initialize regexp, str, first, last
@match_data = regexp.match str[first...last]
@first, @last = first, last
end
def begin index
@match_data.begin(index) + @first
end
def end index
@match_data.end(index) + @last
end
def offset index
[self.begin(index), self.end(index)]
end
def method_missing msg, *arg
@match_data.send msg, *arg
end
end
class Regexp
def match_range str, first, last
MatchRange.new self, str, first, last
end
end
用法就變成:
# Ruby
/\w/.match_range(str, begin_pos, end_pos)
當然,還可以考慮配合 WanCW 板友的 Overload module :p
: P.S Ruby 1.9 似乎要加入 begin_pos, 但是 end_pos 好像沒有?
記得有聽說 external iterator 的呼聲
不過詳細我不清楚,稍微看了一下 generator 似乎不能用
--
Nobody can take anything away from him.
Nor can anyone give anything to him.
What came from the sea,
has returned to the sea.
Chrono Cross
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.117.167.208
推
09/28 22:40, , 1F
09/28 22:40, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
Ruby 近期熱門文章
PTT數位生活區 即時熱門文章