2014-07-17 35 views
3

在Python我可以這樣做:紅寶石正則表達式匹配起始於特定位置

import re 
regex = re.compile('a') 

regex.match('xay',1) # match because string starts with 'a' at 1 
regex.match('xhay',1) # no match because character at 1 is 'h' 

但是在Ruby中,match方法似乎符合一切都會過去的位置參數。例如,/a/.match('xhay',1)將返回一個匹配,即使匹配實際上從2開始。但是,我只想考慮從特定位置開始的匹配。

如何在Ruby中獲得類似的機制?我想在Python中匹配從字符串中特定位置開始的模式。

+0

爲什麼不'STR [1] ==「a'' ? –

+0

@ArupRakshit我承認我給出的例子相當簡單,但在我的程序中,我有一個正則表達式集合,並且使用一些邏輯來確定哪個正則表達式用於下一個令牌的邏輯,這些正則表達式基於哪個先前的正則表達式匹配。 – math4tots

回答

3

如何使用以下StringScanner

require 'strscan' 

scanner = StringScanner.new 'xay' 
scanner.pos = 1 
!!scanner.scan(/a/) # => true 

scanner = StringScanner.new 'xnnay' 
scanner.pos = 1 
!!scanner.scan(/a/) # => false 
+1

好。這就對了。 – sawa

+0

被警告你的解決方案不適用於utf-8編碼的多字節字符:'scanner = StringScanner.new'áay'; scanner.pos = 1; scanner.scan(/ a /)#=> nil' –

+1

更好的解決方案是依賴像'/ ^。(a)/'這樣的正則表達式模式。 –

4
/^.{1}a/ 

的字符串

/^.{x}a/ 

在位置x+1匹配a - >DEMO

+0

@ArupRakshit它是一個文字,與'a'字符匹配 – GolfWolf

+0

儘管這在技術上可以回答我的問題,但在我的程序中,我無法訪問實際的正則表達式(我將正則表達式作爲函數參數傳遞)。我想我可以轉換爲正則表達式來處理一個字符串,並且可能會有一個更清晰的方法? – math4tots

+1

你可以插入正則表達式,不應該看起來太尷尬。 – nicooga

1

Regexp#match有一個可選的第二個參數pos,但它像Python的search方法。但是,您可以檢查返回MatchData開始在指定的位置:

re = /a/ 

match_data = re.match('xay', 1) 
match_data.begin(0) == 1 
#=> true 

match_data = re.match('xhay', 1) 
match_data.begin(0) == 1 
#=> false 

match_data = re.match('áay', 1) 
match_data.begin(0) == 1 
#=> true 

match_data = re.match('aay', 1) 
match_data.begin(0) == 1 
#=> true 
0

擴展什麼@sunbabaphu回答一點點:

def matching_at_pos(x=0, regex) 
    /\A.{#{x-1}}#{regex}/ 
end # note the position is 1 indexed 

'xxa' =~ matching_at_pos(2, /a/) 
=> nil 
'xxa' =~ matching_at_pos(3, /a/) 
=> 0 
'xxa' =~ matching_at_pos(4, /a/) 
=> nil