Ruby正则表达式匹配从特定位置开始

时间:2014-07-17 12:03:00

标签: ruby regex

在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中匹配从字符串中特定位置开始的模式。

4 个答案:

答案 0 :(得分:4)

/^.{1}a/

用于匹配字符串

中位置a的{​​{1}}
x+1

- > DEMO

答案 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