作者godfat (godfat 真常)
看板Ruby
标题Re: [问题] Regexp 不方便的地方
时间Thu Sep 28 16:33:21 2006
※ 引述《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
1F:推 lg31cm:thank you~ 09/28 22:40