2012-11-19 31 views
1

我正在尋找一種方法來匹配第一個符號的字符串,但考慮到我給匹配方法的偏移量。Ruby Regexp#匹配匹配字符串開始與給定的位置(Python重新喜歡)

test_string = 'abc def qwe' 
def_pos = 4 
qwe_pos = 8 

/qwe/.match(test_string, def_pos) # => #<MatchData "qwe"> 
# ^^^ this is bad, as it just skipped over the 'def' 

/^qwe/.match(test_string, def_pos) # => nil 
# ^^^ looks ok... 

/^qwe/.match(test_string, qwe_pos) # => nil 
# ^^^ it's bad, as it never matches 'qwe' now 

就是我要找的是:

/...qwe/.match(test_string, def_pos) # => nil 
/...qwe/.match(test_string, qwe_pos) # => #<MatchData "qwe"> 

任何想法?

回答

1

如何使用字符串切片?

/^qwe/.match(test_string[def_pos..-1]) 

pos參數告訴正則表達式引擎從哪裏開始的比賽,但它不會改變開始的行(及其他)錨的行爲。 ^仍然只匹配一行的開頭(並且qwe_pos仍然在test_string的中間)。

另外,在Ruby中,\A是「字符串開頭」錨點,\z是「字符串結束點」錨點。 ^$也匹配行的開始/結束,並且沒有選項可以改變這種行爲(這對於Ruby來說是特別的,就像(?m)那麼(?s)在其他正則表達式中所做的一樣)...

+0

是的,謝謝。在類似的問題中有相同​​的想法:http://stackoverflow.com/questions/7292976/ruby-string-how-to-match-a-regexp-from-a-defined-position?rq=1。現在只需要計算這對BIG字符串的性能影響 – Farcaller

+0

好吧,似乎沒有什麼大的性能打擊,並且我在性能分析方面贏得了另外1個秒鐘:) – Farcaller

+0

感謝您的補充。已經意識到爲什麼^(\ n +)組在「<...」上匹配。 – Farcaller