正規表現による置換で質問です


Rayque  2012-06-19 00:39:48  No: 73434  IP: 192.*.*.*

DAOからADOに変換した際に、
SQL使用しているlike文のワイルドカード(*)が使用できないようで
取得できなくなってしまったので、
like '*ABC*'などをlike '%ABC%'と置換したいのですが、
自動生成部分もあり、できあがったSQL文を
正規表現で*を%に置換したいのですが、正規表現の文がわかりません。
わかる方がお見えになりましたらご教授お願いいたします。

置換したい例:
置換前
select * from tbl where fID like '*13*';
select * from tbl where fID like 'ID25*';
select * from tbl where fID like '*E';
select * from tbl where fID like '99999';
置換後
select * from tbl where fID like '%13%';
select * from tbl where fID like 'ID25%';
select * from tbl where fID like '%E';
select * from tbl where fID like '99999';

編集 削除
Blue  2012-06-19 13:41:00  No: 73435  IP: 192.*.*.*

置換とはVisual Studioのエディタ機能の話でしょうか?
そうであれば、バージョンとか明記してもらわないと回答がつかないかも。

編集 削除
tetrapod  2012-06-20 18:10:05  No: 73436  IP: 192.*.*.*

置換元文字列がどこにあって / どこから来て
置換先をどこに置く / どこへ送る
のか、まったく話が見えないので、回答のつけようがない、わけだ。

妄想するに シングルコーテーション文字で囲まれた * を % に置換したい
ってことだろうか?
単純にそうすると「米文字 * を検索したい」というときにまずい。
というわけで正規表現どうこうの前に案件整理が必要だろうな。

編集 削除
Rayque  2012-06-21 00:38:19  No: 73437  IP: 192.*.*.*

VC++ 2010を使用し、プログラム上で変換したいです。
(理由:SQL文がデータベースで管理されていたり、プログラムに組み込まれていたり。色々組み合わせているため、SQL文を容易に変更できないのと、変更したとのテスト(修正箇所の全パステスト)が膨大になるため)
LIKEにある*がネックになっていて、LIKEのあとの''で囲われた部分内の*をすべて%にしたいです。

編集 削除
tetrapod  2012-06-21 07:19:28  No: 73438  IP: 192.*.*.*

既に書いたとおり
> 「米文字 * を検索したい」というときにまずい。
ので、
・検索文字列が * を含む場合にどんな SQL 文が生成されていて、
・その SQL 文のうち、どの * を % に置換すべきか
・その SQL 文のうち、どの * を % に置換してはならないか
その辺の分析無しにコード化することは不可能。

SQL 文を動的生成している時点できな臭いにおいが漂ってくるのだが、
現プログラムの SQL インジェクション脆弱性の検証をすべきだろうな。
脆弱性あり、ということになったら元プログラムを作り直す必要があるので
外からほげほげする、ってのは無しになりかねない。

元プログラムに脆弱性が無いとして
置換することで脆弱性を生み出す可能性も0ではないので
> テスト(修正箇所の全パステスト)が膨大になるため
テスト量は変わらないと思うぞ

編集 削除
名前なし  2012-06-22 00:47:42  No: 73439  IP: 192.*.*.*

質問に対しての回答では無くなってきている気がしますが・・・。
私ならですが正規表現だけだと難しいと思うので(というか詳しくない)
簡単なソフト作ってしまいますね。
シングルクォーテーション見つけたらフラグ立てて置き換え
必要なら"LIKE"も条件に入れればソコソコ変換できるかと。

もしくは"LIKE"でgrepかけて修正の方が実は早いかも。
最終的にはやっぱり手動で確認になりそうな気がします。

編集 削除