前提
Rubyにて正規表現の実験中によくわからないことが起きました.
誰かこの挙動について説明していただけたら幸いです.
該当のソースコード
ruby
1str = """ 2def、 3ghi 4""" 5 6md = str.match(/([^、]*)、([^、]*?)$/) 7print md[2].inspect
出力
""
試したこと
Pythonにて似たコードを実行してみました.
python
1import re 2s = """ 3def、 4ghi 5""" 6mt = re.search(r"([^、]*)、([^、]*?)$",s) 7print(repr(mt.group(2)[:]))
'\nghi'
私はこのPythonの実行例のような挙動をするものと思っていました.
RubyマニュアルにもPythonドキュメントにも"$"記号は文字列の末尾、あるいは文字列の末尾の改行の直前にマッチすると書かれています.
なので私としては,両言語ともに"([^、])、([^、])$"の場合,マッチが成功する最長の文字列となることから"$"を文字列の末尾とみなして"\nghi\n"を返すと思っています.実際これは両言語とも合っていました.
しかし,"([^、])、([^、]?)$"の場合,マッチが成功する最短の文字列で"$"を文字列の末尾の改行の直前とみなし"\nghi"を返すと思っていましたが,この予測は外れました.
この挙動について私の正規表現の考え方がおかしい,プログラムの記述が悪くてその実行結果が意図しないものとなっている等,誰かこの挙動について説明してくださると幸いです.
補足情報(FW/ツールのバージョンなど)
回答1件
あなたの回答
tips
プレビュー