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";
今の例見たいに” ”中身が改行してある時は検索できませんでした。
どなたかご教授していただければ幸いです。

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

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2009/07/07 15:45:07
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:miyamuko No.2

回答回数29ベストアンサー獲得回数11

ポイント35pt

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

2009/07/01 16:26:04

その他の回答1件)

id:b-wind No.1

回答回数3344ベストアンサー獲得回数440

ポイント35pt
Pattern p = Pattern.compile("\".*\"",Pattern.MULTILINE);

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

Pattern (Java 2 Platform SE 5.0)


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

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

id:kimu_507

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

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

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

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

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

2009/06/30 16:04:58
id:miyamuko No.2

回答回数29ベストアンサー獲得回数11ここでベストアンサー

ポイント35pt

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

2009/07/01 16:26:04

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません