在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 :(得分:4)
答案 1 :(得分: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
答案 2 :(得分: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
答案 3 :(得分: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