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

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

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

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

正規表現

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

Q&A

解決済

3回答

1107閲覧

末尾の条件に忖度してくれたのか

aaaaaaaa

総合スコア501

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

正規表現

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

0グッド

0クリップ

投稿2016/07/27 11:23

555555555という数字の羅列に、正規表現を使って三桁ごとにコンマを挿入したいとき、
s/(?<=\d)(?=(\d\d\d)+$)/,/
のように記述することで、555,555,555となります。
これは、既に読んだ部分に数字があって、まだ読んでない部分に三つの数字の羅列のカタマリが一つ以上在って且つそれが文の末尾でもあるときにマッチするものです。
ここで疑問なのですが、なぜ、5,555,555,55とならないのでしょうか。後読みの部分は、量指定子が無いため"数字(\d)が一つ"であって数字が一つ"以上"とはならないように思います。
しかし、マッチしたものをみると555,5...と5が三つ並んでいます。指定した文字が一つ以上を意味する「+」が無いのになぜ三つの5のあとにコンマが入ったのだろうと疑問に思っております。

今考える限りだと、位置指定の「$」が指定してあるためコンマから見て末尾が三の倍数の数値でなければならないので量指定子「+」が無くても555,555,555となったのかと推測したのですがどうなのでしょうか。
つまり、末尾に三の倍数個だけ数が無いとマッチしないので、量指定子「+」がないが555,555,555にしてやろうとPCが忖度してくれたのでしょうか。

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

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

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

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

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

guest

回答3

0

先頭に ^ がありませんので、正規表現は任意の位置からマッチします。
お察しの通り $ があるため、末尾から3の倍数個の位置にマッチすることになります。

555555555 ^~~~~~~ | | (?<=\d) `- (?=(\d\d\d)+$)

雑に AA にするとこんな感じです。

投稿2016/07/27 11:39

thinca

総合スコア1864

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

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

0

ベストアンサー

肯定後読みと肯定先読みの性質さえ理解すれば
単純に左から評価しているのがわかります
(?<=.)(?=.+$)を使って置換すれば各文字の間にカンマがはいるのがわかりますよね?
何かの文字と何かの文字の間に,を挿入(置換)している

仮に123456789を命題の通り変換するとして
(?<=\d)で1より右側が指示され、(\d\d\d)+で
234、567と評価され89があまります。
(\d\d\d)+$で、ケツまで評価してますから89の2文字ではマッチしません

つぎに23456789に対して2より右側を評価、345、678と評価され9一文字ではマッチしない

つぎに3456789に対して3より右側を評価、456、789と評価されケツが$でマッチします
したがって3の後ろにカンマがきます。

引き続き、4だとNG、5だとNG、6でマッチするので6の後ろにカンマ、その後はマッチしません

投稿2016/07/28 02:56

yambejp

総合スコア114779

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

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

0

(?<=\d)(?=(\d\d\d)+$)
これを基準にして、要素を消します。

(?=(\d\d\d)+$)
555555

,555,555

となります。(数字が3の倍数の個数の場合だけおかしくなる)
つまり、最初の(?<=\d)は、先頭が数字であることを確かめているだけです。

(\d\d\d)+$
これは、末尾$から3つずつ数字\dを数えるというものです。
それを先読みしているので、文字と文字の間がマッチします。

改良しました。末尾が文字でも動くやつ
(?<=\d)(?=(\d\d\d)+([^\d]|$))

投稿2016/07/27 14:19

intelf___

総合スコア868

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問