47060


A.

[code]

    echo preg_replace("/[a-z]*/","c","b"); //cc
    
[/code]

B.

[code]

    echo preg_replace("/[a-z]*/","c","1"); //c1c
    
[/code]

* * *

上記結果が理解できないのですが、それぞれどういう風に考えるのですか？

* * *

A.  
・bは[a-z]に該当するからcへ置換  
・直前の[a-z]がないからc？？

B.  
・1は[a-z]に該当しないので0回以上に該当するからc  
・？？？


CC BY-SA 4.0
2018-07-28T13:36:59.783
47056
2018-07-28T14:17:31.247
7886
question
php 正規表現
0個以上の並び を表す*について


Markdown表記の都合もあるため、正規表現のマッチ開始位置を`<`、終了位置を`>`で表します。

>
[code]

>     echo preg_replace("/[a-z]*/","c","b"); //cc
>  
[/code]

`"b"`に対して`"/[a-z]*/"`でマッチを行うわけですが、`*`は最長一致で直前にある`[a-z]`を満たす限り続けられます。  
そのため初回は`"<b>"`がマッチします。これが`"c"`に置き換えられます。この時点で既に終端に達していますが再度マッチ行われます。`*`は長さ０も認められるため`"c<>"`がマッチします。これが`"c"`に置き換えられ`"cc"`になります。再度マッチが行われ`"cc<>"`がマッチしそうなところですが同じ場所では二度マッチしないというルール（そうでないと無限ループします）により、これで完了し、`"cc"`が結果となります。

>
[code]

>     echo preg_replace("/[a-z]*/","c","1"); //c1c
>  
[/code]

初回`"<b>1"`→`"c1"`、２回目`"c1<>"`→`"c1c"`、３回目（同じ位置なので終了）


CC BY-SA 4.0
2018-07-28T14:17:31.247
47060
2018-07-28T14:17:31.247
4236
47056
answer