2

我正在寻找一种从第一个符号匹配字符串的方法,但考虑到我给 match 方法的偏移量。

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">

有任何想法吗?

4

1 回答 1

1

使用字符串切片怎么样?

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

pos参数告诉正则表达式引擎从哪里开始匹配,但它不会改变行首(和其他)锚点的行为。^仍然只匹配一行的开头(并且qwe_pos仍然在中间test_string)。

此外,在 Ruby 中,\A是“字符串开始”锚点,\z是“字符串结束”锚点。^并且也$匹配行的开始/结束,并且没有选项可以改变这种行为(这对于 Ruby 来说是特殊的,就像在其他正则表达式风格中的令人着迷的令人困惑的用法一样)(?m)......(?s)

于 2012-11-19T11:26:24.267 回答