タグつき置換についてNo.22637
p4936jp さん 07/02/24 13:24
 
(A)を(B)に一括変換したいです。
いろいろやってみたんですがどうしてもできません orz

(A) sprintf( str, "%s%s", psta, pstb ) ;
 ↓
(B) _snprintf( str, sizeof(str), "%s%s", psta, pstb ) ;


× sprintf\(\f.+\f,  →  _snprintf(\1, sizeof(\1),

どなたか上記のような正規表現を使った変換をわかりやすく
説明してください。お願いします。

[ ]
RE:22637 タグつき置換についてNo.22638
Iranoan さん 07/02/24 13:55
 
 p4936jp さん今日は、Iranoan です。
 念の為お断りしておくと、開発者とは何の関わりも無い単なる一ユーザです。
 正規表現は基本的には最長一致、つまりできるだけ長い範囲で一致するよう
に検索するので、元の文字列が
> (A) sprintf( str, "%s%s", psta, pstb ) ;
>             ~~~~~~~~~~~~~~~~~~
なので、
> × sprintf\(\f.+\f,  →  _snprintf(\1, sizeof(\1),
の置換では、\f に挟まれた部分は、波線部になります。理由は「,」も任意の
文字だからです。これを防ぐには、最短一致にするか「,」を除外すればよい
です。また「 」(空白) も考慮すると、標準設定のままなら
sprintf\( \f.+?\f,  →  _snprintf( \1, sizeof(\1),
設定を変えてあったり、古いヴァージョンなら、
sprintf\( \f[^,]+\f,  →  _snprintf( \1, sizeof(\1),
や、今回の場合 (C 言語の変数部分を \1 としたいので)
sprintf\( \f\w\f,  →  _snprintf( \1, sizeof(\1),
とすれば良いでしょう。

[ ]
RE:22638 タグつき置換についてNo.22639
p4936jp さん 07/02/24 15:13
 
Iranoan さん
こんにちは、p4936jpです。
アドバイスありがとうございます。


> 正規表現は基本的には最長一致、つまりできるだけ長い範囲で一致するよう
>に検索するので、元の文字列が
>> (A) sprintf( str, "%s%s", psta, pstb ) ;
>>             ~~~~~~~~~~~~~~~~~~
>なので、
>> × sprintf\(\f.+\f,  →  _snprintf(\1, sizeof(\1),
>の置換では、\f に挟まれた部分は、波線部になります。理由は「,」も任意の
>文字だからです。これを防ぐには、最短一致にするか「,」を除外すればよい

最長一致という概念があるとは知りませんでした。


>です。また「 」(空白) も考慮すると、標準設定のままなら
>sprintf\( \f.+?\f,  →  _snprintf( \1, sizeof(\1),
>設定を変えてあったり、古いヴァージョンなら、
>sprintf\( \f[^,]+\f,  →  _snprintf( \1, sizeof(\1),
>や、今回の場合 (C 言語の変数部分を \1 としたいので)
>sprintf\( \f\w\f,  →  _snprintf( \1, sizeof(\1),
>とすれば良いでしょう。

変数の前にスペースがあったりなかったりするので
教えていただいた以下の方法を若干調整して変換することが
できました。

>sprintf\( \f\w\f,  →  _snprintf( \1, sizeof(\1),

正規表現は難しいです。・・・
ありがとうございました。



[ ]