2

最初のシンボルから文字列を一致させる方法を探していますが、一致方法に与えるオフセットを考慮しています。

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 に答える