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

ljo96ir5  于 2022-11-22  发布在  Ruby
关注(0)|答案(5)|浏览(160)

在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中所做的那样。

vfh0ocws

vfh0ocws1#

/^.{1}a/

用于匹配字符串中位置x+1处的a

/^.{x}a/

--〉DEMO

svgewumm

svgewumm2#

下面使用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
agyaoht7

agyaoht73#

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
r7knjye2

r7knjye24#

杨帆稍微延伸了一下@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
wvt8vs2t

wvt8vs2t5#

这个问题的答案是\G
当调用String#match的双参数版本(采用起始位置)时,\G匹配regex匹配的起始点。

'xay'.match(/\Ga/, 1) # match because /a/ starts at 1
'xhay'match(/\Ga/, 1) # no match because character at 1 is 'h'

相关问题