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";
今の例見たいに” ”中身が改行してある時は検索できませんでした。
どなたかご教授していただければ幸いです。
よろしくお願いいたします。
これで文字列中にダブルクォートが含まれていた場合でも大丈夫だと思います。
#試していないので動かなかったらすいません。。。
Pattern p = Pattern.compile("((?:\\.|[^\"\\])*)", Pattern.MULTILINE);
正規表現の読み方は以下のようになります。
" # 文字列の開始 ( # キャプチャするグループ化 (?: # キャプチャしないグループ化 \\. # バックスラッシュによってエスケープされた任意の一文字 | # または [^\"\\] # ダブルクォートとバックスラッシュ以外の一文字 ) # グループ化終了 * # ↑の 0 回以上の繰り返し ) # グループ化終了 " # 文字列の終了
"" の中身を () で囲ってキャプチャしているため、必要な文字列は m.group(1) で参照できます。
引数の 1 は左から数えて 1 つのめ開き括弧のグループと言う意味です。(?: の場合は数えません。
こうすれば、ダブルクォートを空文字列で replace する処理は不要になります。
ちなみに 詳説 正規表現 (asin:4873113598) で紹介されている「ループ展開」という
技法を使うと高速になるそうです。
Pattern p = Pattern.compile("\"([^\"\\]*(\\.[^\"\\]*)*)\"", Pattern.MULTILINE);
Pattern p = Pattern.compile("\".*\"",Pattern.MULTILINE);
複数行モードにすればいけると思う。
Pattern (Java 2 Platform SE 5.0)
ただ、この正規表現では文字列中にダブルクォートが含まれていたときなど、正確には抜き出せない。
シンプルな文字列しかないと保証されるならいいけど、あまりおすすめできる方法ではないな。
こんな早速教え頂き本当に有難うございます。
「ただ、この正規表現では文字列中にダブルクォートが含まれていたときなど、正確には抜き出せない。
シンプルな文字列しかないと保証されるならいいけど、あまりおすすめできる方法ではないな。
」
今 javaファイルでSQL文を検出するプログラムを作成してますが 正規表現以外なんかいい方法が
あったらお願いいたします。
これで文字列中にダブルクォートが含まれていた場合でも大丈夫だと思います。
#試していないので動かなかったらすいません。。。
Pattern p = Pattern.compile("((?:\\.|[^\"\\])*)", Pattern.MULTILINE);
正規表現の読み方は以下のようになります。
" # 文字列の開始 ( # キャプチャするグループ化 (?: # キャプチャしないグループ化 \\. # バックスラッシュによってエスケープされた任意の一文字 | # または [^\"\\] # ダブルクォートとバックスラッシュ以外の一文字 ) # グループ化終了 * # ↑の 0 回以上の繰り返し ) # グループ化終了 " # 文字列の終了
"" の中身を () で囲ってキャプチャしているため、必要な文字列は m.group(1) で参照できます。
引数の 1 は左から数えて 1 つのめ開き括弧のグループと言う意味です。(?: の場合は数えません。
こうすれば、ダブルクォートを空文字列で replace する処理は不要になります。
ちなみに 詳説 正規表現 (asin:4873113598) で紹介されている「ループ展開」という
技法を使うと高速になるそうです。
Pattern p = Pattern.compile("\"([^\"\\]*(\\.[^\"\\]*)*)\"", Pattern.MULTILINE);
返事遅くなってすみません。
今正規表現を勉強しているところです。
こんな詳しく説明して頂き本当に有難うございます。
すごく勉強になりました。
返事遅くなってすみません。
今正規表現を勉強しているところです。
こんな詳しく説明して頂き本当に有難うございます。
すごく勉強になりました。