teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

「逆順にして置き換え処理」、「繰り返し」追加

2016/05/24 05:58

投稿

pmint
pmint

スコア33

answer CHANGED
@@ -9,4 +9,21 @@
9
9
  s/(¥d¥d¥d)(?=¥d)/$1,/g
10
10
  ```
11
11
 
12
- でもこれだと「左から3桁ずつ」なので、よくないですね。
12
+ でもこれだと「左から3桁ずつ」なので、よくないですね。
13
+ 終端から先頭方向へマッチする表現が無いので、文字を逆順にするか、繰り返し処理する必要があると思います。
14
+
15
+ ```regex
16
+ # 逆順にして置き換え処理
17
+ $a = '「555555555」';
18
+ $a = reverse $a;
19
+ $a =~ s/(\d\d\d)(?=\d)/$1,/g;
20
+ $a = reverse $a;
21
+ print $a;
22
+ ```
23
+
24
+ ```regex
25
+ # 繰り返し
26
+ $a = '「555555555」';
27
+ while($a =~ s/(?<=\d)(\d\d\d)(?=\D)/,$1/){};
28
+ print $a;
29
+ ```

2

後読み

2016/05/24 05:58

投稿

pmint
pmint

スコア33

answer CHANGED
@@ -1,12 +1,12 @@
1
1
  マッチしていたら5の個数は減るはずですよね。結果を見ると文字間(0文字)にマッチしているようです。
2
- 先読み(<?=)・後読み(?=)の間の「本体にあたる部分」がないので、読みの(?=)を外せば意味を成すようになるのではないでしょうか。
2
+ 先読み(<?=)・後読み(?=)の間の「本体にあたる部分」がないので、読みの(<?=)を外せば意味を成すようになるのではないでしょうか。
3
3
 
4
4
  ,を複数入れるのでgオプションは必須です。
5
5
  3桁ごとに一回の置き換えなので、(¥d¥d¥d)+とはできません。9桁でも,ひとつだけの出力になってしまいます。
6
6
  元の文字は1文字も失わないようにするので、(?:)ではなく()を使って、後方参照できるようにします。
7
7
 
8
8
  ```regex
9
- s/(?<=¥d)(¥d¥d¥d)/$1,/g
9
+ s/(¥d¥d¥d)(?=¥d)/$1,/g
10
10
  ```
11
11
 
12
- これでいかがしょうか
12
+ でもこれだと「左から3桁ずつ」なの、よくないですね

1

s

2016/05/24 05:02

投稿

pmint
pmint

スコア33

answer CHANGED
@@ -6,7 +6,7 @@
6
6
  元の文字は1文字も失わないようにするので、(?:)ではなく()を使って、後方参照できるようにします。
7
7
 
8
8
  ```regex
9
- /(?<=¥d)(¥d¥d¥d)/$1,/g
9
+ s/(?<=¥d)(¥d¥d¥d)/$1,/g
10
10
  ```
11
11
 
12
12
  これでいかがでしょうか。