我正在寻找一种方法来匹配第一个符号的字符串,但考虑到我给匹配方法的偏移量。
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">
有什么想法吗?
答案 0 :(得分:1)
如何使用字符串切片?
/^qwe/.match(test_string[def_pos..-1])
pos
参数告诉正则表达式引擎在哪里开始匹配,但它不会改变行首(和其他)锚点的行为。 ^
仍然只在一行的开头匹配(qwe_pos
仍在test_string
的中间。)
此外,在Ruby中,\A
是“字符串开始”锚点,\z
是“字符串结束”锚点。 ^
和$
也匹配行的开头/结尾,并且没有选项可以更改该行为(这对Ruby来说是特殊的,就像使用(?m)
的迷人混淆一样(?s)
在其他正则表达式中的作用)...