CSVデータを正規表現で抜き出せません・・・。
お疲れ様です。初投稿になります。
どうぞ宜しくお願い致します。
CVSデータ(囲い文字:"(ダブルコーテーション))を正規表現でマッチングさせ、抜き出そうと考えています。
エスケープ文字を以下のように設定しています。
・""(ダブルコーテーション * 2) ⇒ "(ダブルコーテーション)
・\"(円記号 + ダブルコーテーション) ⇒ "(ダブルコーテーション)
・\\(円記号 * 2) ⇒ \(円記号)
例えば・・・
"A",""",BB,"",\",CC,\\,DD""","EEEE","",
ですと、「"A"」「""",BB,"",\",CC,\\,DD"""」「"EEEE"」「""」と取れる想定になります。
特に2番目の「""",BB,"",\",CC,\\,DD"""」は、
「"""(←escape),BB,""(←escape),\"(←escape),CC,\\(←escape),DD""(←escape)"」
という想定です。
PHP関数ではエスケープ文字の問題により取得しきれず、自力での取得を行っております。
私が考えた正規表現は「"[^"]*((""|\\")[^"]*)*[^\\]",|"",」となりますが、カンマが入り乱れる上記パターンを満たすことができません。
これは、正規表現での解決は不可能でしょうか?
何日も解決できず、困っています・・・。
是非、皆様のお力添えのほど、宜しくお願い致します。
PS.
このサイトで動作確認を行っておりました。
参考になれば幸いです。
http://www.rider-n.sakura.ne.jp/regexp/regexp.php
お礼
ありがとうございました。無事解決しました。 シングルクォーテーションが正しくエスケープされているようですので、 Validatorでシングルクォーテーションをエラーにするのはやめます。 SQLインジェクション対策としては完璧ではないかもしれませんが、 そのあたりの対策はDBまわりの調整等、別の視点で調整します。 ありがとうございました。
補足
ありがとうございます。 PreparedStatementの記述方法はわかったつもりだったのですが、 結局うまくいきません・・・・すいませんが下記どこがおかしいかわかりますか? 「テーブルA」の構造 列1 smallint 列2 character(50) 列3 date String sql_s = "insert into テーブルA values(?,?,?);"; Pstmt = conn.prepareStatement(sql_s); Pstmt.setShort(1,Short.parseShort(this.snumber)); Pstmt.setString(2,this.title); Pstmt.setDate(3,java.sql.Date.valueOf(this.e_date)); int up_cnt = Pstmt.executeUpdate(); ←ここで実行時エラー PstmtがPreparedStatementで、conn は Connection、 this.snumber, this.title, this.e_date は String です。 (null値だったり、型が違ったりはしていません。) 変換後のSQLは Pstmt.toString()で見れると思ったのですが、 これも違うみたいですね・・・