人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

javaでの正規表現で""の中身を抽出する質問です。

javaでの正規表現なのですが、""の中身の抽出を行いたいのです。
たとえば、String query= "select * from shain";
というSQL文があるファイルにあた時に

String select ="select *";
if (line.toLowerCase().indexOf(select) != -1) {
// 部分一致した時
Pattern p = Pattern.compile("\".*\""); // 正規表現
Matcher m = p.matcher(line);
if (m.find()) {
System.out.println(m.group().replace("\"", ""));// "を空文字で置き換える
}
結果は select * from shainが出力しますが。

例 ; String query= "select *
from shain";
今の例見たいに” ”中身が改行してある時は検索できませんでした。
どなたかご教授していただければ幸いです。

よろしくお願いいたします。

●質問者: kimu_507
●カテゴリ:コンピュータ
✍キーワード:GROUP Java Matcher Out SELECT
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● b-wind
●35ポイント
Pattern p = Pattern.compile("\".*\"",Pattern.MULTILINE);

複数行モードにすればいけると思う。

Pattern (Java 2 Platform SE 5.0)


ただ、この正規表現では文字列中にダブルクォートが含まれていたときなど、正確には抜き出せない。

シンプルな文字列しかないと保証されるならいいけど、あまりおすすめできる方法ではないな。

◎質問者からの返答

こんな早速教え頂き本当に有難うございます。

「ただ、この正規表現では文字列中にダブルクォートが含まれていたときなど、正確には抜き出せない。

シンプルな文字列しかないと保証されるならいいけど、あまりおすすめできる方法ではないな。

今 javaファイルでSQL文を検出するプログラムを作成してますが 正規表現以外なんかいい方法が

あったらお願いいたします。


2 ● miyamuko
●35ポイント ベストアンサー

これで文字列中にダブルクォートが含まれていた場合でも大丈夫だと思います。

#試していないので動かなかったらすいません。。。

Pattern p = Pattern.compile("((?:\\.|[^\"\\])*)", Pattern.MULTILINE);

正規表現の読み方は以下のようになります。

" # 文字列の開始
 ( # キャプチャするグループ化
 (?: # キャプチャしないグループ化
 \\. # バックスラッシュによってエスケープされた任意の一文字
 | # または
 [^\"\\] # ダブルクォートとバックスラッシュ以外の一文字
 ) # グループ化終了
 * # ↑の 0 回以上の繰り返し
 ) # グループ化終了
" # 文字列の終了

"" の中身を () で囲ってキャプチャしているため、必要な文字列は m.group(1) で参照できます。

引数の 1 は左から数えて 1 つのめ開き括弧のグループと言う意味です。(?: の場合は数えません。

こうすれば、ダブルクォートを空文字列で replace する処理は不要になります。


ちなみに 詳説 正規表現 (asin:4873113598) で紹介されている「ループ展開」という

技法を使うと高速になるそうです。

Pattern p = Pattern.compile("\"([^\"\\]*(\\.[^\"\\]*)*)\"", Pattern.MULTILINE);
◎質問者からの返答

返事遅くなってすみません。

今正規表現を勉強しているところです。

こんな詳しく説明して頂き本当に有難うございます。

すごく勉強になりました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ