質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

1回答

888閲覧

Rubyの正規表現について

UMA821

総合スコア27

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2021/12/10 08:26

前提

Rubyにて正規表現の実験中によくわからないことが起きました.
誰かこの挙動について説明していただけたら幸いです.

該当のソースコード

ruby

1str = """ 2def3ghi 4""" 5 6md = str.match(/([^、]*)、([^、]*?)$/) 7print md[2].inspect

Wandbox - ruby HEAD 3.1.0dev

出力
""

試したこと

Pythonにて似たコードを実行してみました.

python

1import re 2s = """ 3def、 4ghi 5""" 6mt = re.search(r"([^、]*)、([^、]*?)$",s) 7print(repr(mt.group(2)[:]))
'\nghi'

Wandbox - CPython HEAD 3.11.0

私はこのPythonの実行例のような挙動をするものと思っていました.
RubyマニュアルにもPythonドキュメントにも"$"記号は文字列の末尾、あるいは文字列の末尾の改行の直前にマッチすると書かれています.

なので私としては,両言語ともに"([^、])、([^、])$"の場合,マッチが成功する最長の文字列となることから"$"を文字列の末尾とみなして"\nghi\n"を返すと思っています.実際これは両言語とも合っていました.
しかし,"([^、])、([^、]?)$"の場合,マッチが成功する最短の文字列で"$"を文字列の末尾の改行の直前とみなし"\nghi"を返すと思っていましたが,この予測は外れました.

この挙動について私の正規表現の考え方がおかしい,プログラムの記述が悪くてその実行結果が意図しないものとなっている等,誰かこの挙動について説明してくださると幸いです.

補足情報(FW/ツールのバージョンなど)

Wandbox - ruby HEAD 3.1.0dev
Wandbox - CPython HEAD 3.11.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2021/12/10 13:57

お書きのリンク先のマニュアルに書いてありますね。 Ruby「文字列の末尾もしくは改行の手前」 Python「文字列の末尾、あるいは文字列の末尾の改行の直前」 と意味が異なることは明白です。
UMA821

2021/12/10 15:26

回答ありがとうございます。 そうですね,Pythonでのre.MULTILINEの指定があるのとないのとでごちゃごちゃになっていました.
guest

回答1

0

ベストアンサー

ruby の正規表現においては、$ は「行」の末尾にマッチします。つまり改行コード(newline)の直前にもマッチします。

ruby

1md = str.match(/([^、]*)、$([^、]*)$/) 2puts md[1].inspect 3puts md[2].inspect 4 5# 6"\ndef" 7"\nghi\n"

「文字列の末尾」には \z\Z を指定します。

ruby

1md = str.match(/([^、]*)、([^、]*?)\Z/) 2puts md[2].inspect 3 4# 5"\nghi"

投稿2021/12/10 09:21

melian

総合スコア19865

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

UMA821

2021/12/10 09:31

回答ありがとうございます。 Ruby において$ は「行」の末尾にマッチするのですね。 他にも\zなど有益な情報提供ありがとうございます。 もう一つ気になることがあります。 "([^、]*)、([^、]*?)$"と正規表現を入力した場合のRubyの挙動がわからないというものなのですが、これについても解説していただけると非常に嬉しいです。
melian

2021/12/10 09:58

$ は \n の直前にマッチしますので、([^、]*?)$ は "def、" の直後にある改行コードの直前にマッチする事になります(空文字になります)。
UMA821

2021/12/10 10:24

よく理解できました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問