![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
Java(version 1.5.0_05)の正規表現を使った画像URLの自動リンクで
行き詰っています。
通常のリンクタグは
pattern = Pattern.compile("(http://|https://){1}[\\w\\.\\-/:&?,=#]+",Pattern.CASE_INSENSITIVE);
でうまく変換できているのですが、
画像の場合、
pattern = Pattern.compile("(http://|https://){1}[\\w\\.\\-/:&?,=#]+(jpg|jpeg|gif|png|bmp)",Pattern.CASE_INSENSITIVE);
としてもマッチせず、
変換ができません。
正規表現が間違えているのは分かっているのですが、
どこをどう変えたらよいのか教えてください。
宜しくお願いいたします。
No.3ベストアンサー
- 回答日時:
うわぁ。
だいぶ悩んでしまいました…。もう2時だ。寝よ。とりあえずメソッドの利用法の間違いですね。
この場合、findを使用すべきです。他の部分にも問題がありそうですけど、正規表現の部分はとりあえず画像URLのマッチの部分はOKかなと。
matches:領域全体をこのパターンとマッチします。
find:入力シーケンスからこのパターンとマッチする次の部分シーケンスを検索します。
あとどうでもいい話ですけど、なんとなくプログラムの雰囲気が、Javaっぽくないなー(Cかな?)とか思いました。
夜遅くまで考えていただいて大変申し訳ないです...
ずっとmatchesを使うものとばかり思っていまして、そこがネックだったんですね。
領域シーケンスというのがいまいちイメージつかめませんでした。
私はC言語からプログラムというものを始めて、Javaはまだ経験が浅いです。
これだけの行数のソースでも雰囲気というものがあるんですね。
長いお付き合いありがとう御座いました。
No.4
- 回答日時:
IMGタグ用のパターンを
http(s?)://[\\w\\.\\-/:&?,=#]+\\.(jpg|jpeg|gif|png|bmp)
、Aタグ用のパターンを
([^\\p{Punct}])(http(s?)://[\\w\\.\\-/:&?,=#]+)([^\\p{Punct}])
としたうえで、2番目のreplaceAllの引数に
$1<A HREF=\"$2\">$2</A>$4
をセットしてみてください。
変更した点は、
1. 先頭の^と後尾の$を削除。
2. 拡張子(.)の前に\\を追加。
3. Aタグ用のパターンについては、IMGタグに変換済みのURLを拾わないように、直前および直後に記号文字がある場合は無視すべく[^\\p{Punct}]を追加。(本来、[^\\"]とすべきでしょうが、私のエディタがエスケープされた"を文字列の終了と勘違いして警告を出して困るので、あえて\p{Punct}としました)
4. 2番目の置換パターンを3の変更に合わせて修正。
動くかどうかよりも、その理由を知ることのほうが大事だと思います。
この回答への補足
arakororinさん、bobvivさんの回答と色々試した結果、
以下のようなメソッドになりました。
public static String AutoLink(String s){
//正規表現用変数
Pattern pattern;
Matcher matcher;
//優先順位に注意
//画像パターン
pattern = Pattern.compile("http(s?)://[\\w\\.\\-/:&?,=#]+\\.(jpg|jpeg|gif|png|bmp)",Pattern.CASE_INSENSITIVE);
matcher = pattern.matcher(s);
if(matcher.find()){//画像なのでイメタグを利用する
s = matcher.replaceAll("<IMG SRC=\"$0\">");
}
//画像以外のリンクパターン(入力文字列sがhttpで始まるもの以外)
pattern = Pattern.compile("([^\"]|\\p{Blank}|\\n|\\r)(http(s?)://[\\w\\.\\-/:&?,=#]+)([^\"]|\\p{Blank}|\\n|\\r)",Pattern.CASE_INSENSITIVE);
matcher = pattern.matcher(s);
if(matcher.find()){//画像でないのでAタグを利用する
s = matcher.replaceAll("$1<A HREF=\"$2\" target=_blank>$2</A>$4");
}
//入力文字列sがhttpで始まるもののリンクパターン
if(s.substring(0,4).equals("http")){
pattern = Pattern.compile("^http(s?)://[\\w\\.\\-/:&?,=#]+",Pattern.CASE_INSENSITIVE);
matcher = pattern.matcher(s);
if(matcher.find()){//画像でないのでAタグを利用する
s = matcher.replaceAll("<A HREF=\"$0\" target=_blank>$0</A>");
}
}
return s;
}
findの箇所は冗長かも知れませんが、今後の機能追加などの為においておこうと思います。
正規表現にはあまり触れたことがなく、頂いた回答で「なるほど、そういう考え方をするといいのか!」と新しい発見をしました。
ありがとうとう御座いました。
No.2
- 回答日時:
すみません。
ソースを貼れという言葉では不十分でした。入力の文字列の例を教えていただきたいです。タブン、画像のはずの文字列でマッチする正規表現ということなのだと思うのですが。私の認識では以下のコードで動くはずだと思うのですが、本当にこれではうまくいきませんか?
Pattern patternB = Pattern
.compile(
"^http(s?)://[\\w\\.\\-/:&?,=#]+.((jpg)|(jpeg)|(gif)|(png)|(bmp))$",
Pattern.CASE_INSENSITIVE);
この回答への補足
こちらこそ入力文字列がなにかお知らせせずに申し訳ありません。
掲示板として、ユーザに文字列を入力してもらいまして、下記のような
動きになるようにしたいと思っています。
パターン(変換無し):
入力「あいうえお」
変換後「あいうえお」
パターン(Aタグ変換):
入力「あいhttp://www.google.comうえお」
変換後「あい<A HREF="http://www.google.com" TARGET=_BLANK>http://www.google.com</A>うえお」
パターン(IMGタグ変換)
入力「あいうhttp://www.google.com/title.jpgえお」
変換後「あいう<IMG SRC="http://www.google.com/title.jpg">えお」
パターン(混合)
入力「あhttp://www.google.comいうhttp://www.google.com/title.jpgえお」
変換後「あ<A HREF="http://www.google.com" TARGET=_BLANK>http://www.google.com</A>いう<IMG SRC="http://www.google.com/title.jpg">えお」
といったようにURLが入力された場合に、画像ならIMGタグ、それ以外の
URLならAタグを使った文字列に変換したいのですが、画像でもAタグに
変換されてしまいます。
Pattern patternB = Pattern
.compile(
"^http(s?)://[\\w\\.\\-/:&?,=#]+.((jpg)|(jpeg)|(gif)|(png)|(bmp))$",
Pattern.CASE_INSENSITIVE);
としてみましたが、やはりAタグに変換されてしまいました。
No.1
- 回答日時:
まずソースを貼ってください。
そうでなければ的確なアドバイスは難しいです。
Pattern patternB = Pattern
.compile(
"^http(s?)://[\\w\\.\\-/:&?,=#]+.((jpg)|(jpeg)|(gif)|(png)|(bmp))$",
Pattern.CASE_INSENSITIVE);
とりあえずこんなんでどうでしょう?
この回答への補足
ソースは、
//自動リンク
public static String AutoLink(String s){
//正規表現用変数
Pattern pattern;
Matcher matcher;
pattern = Pattern.compile("(http://|https://){1}[\\w\\.\\-/:&?,=#]+(jpg|jpeg|gif|png|bmp)",Pattern.CASE_INSENSITIVE);
matcher = pattern.matcher(s);
//優先順位に注意
if(matcher.matches()){//画像なのでイメタグを利用する
s = matcher.replaceAll("<IMG SRC=\"$0\">");
}else{//画像でないのでAタグを利用する
pattern = Pattern.compile("(http://|https://){1}[\\w\\.\\-/:&?,=#]+",Pattern.CASE_INSENSITIVE);
matcher = pattern.matcher(s);
s = matcher.replaceAll("<A HREF=\"$0\" target=_blank>$0</A>");
}
return s;
}
になります。
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 英語 マーブル柄のまな板は英語表記にしたらこちらであっていますでしょうか? Marble pattern 1 2022/06/30 21:14
- HTML・CSS リンクバナーのHTMLタグ。画像を変えたり、設置位置を変えるとバナー貼付け側はどう見える? 2 2023/02/01 12:01
- 英語 Recently, dental implants have been suggested havi 4 2022/06/10 08:55
- Excel(エクセル) Excel2019 マクロを使用し画像を貼り付けした際のリンク切れについて 2 2022/11/15 16:14
- その他(プログラミング・Web制作) Leafletで画像をon、offさせる方法について 2 2022/11/01 15:34
- フリーソフト 倍率自動調整して全画面表示できるフリーの画像ビューアー 1 2023/08/24 10:55
- JavaScript [Java] Edgeでのアドレスバー非表示について 3 2022/04/20 17:51
- 工学 NFAからDFAの変換について 1 2022/05/28 01:45
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- その他(形式科学) 非決定性有限オートマトンの問題について 1 2022/07/21 21:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列にnullを代入すると、null...
-
質問です。 配列が100以上の場...
-
CSV出力を画面から選択したデー...
-
サーブレットをapacheで公開す...
-
Eclipse 動的プロジェクトで404...
-
マイクラでPythonのプログラミ...
-
下記のリストならno002が含まれ...
-
is this even a thing?
-
JAの支部?地域の農協のカード...
-
えハミルトン路と全域木のちが...
-
ショートカットキーについて
-
list の空は [] ってあわらすのに
-
あんまりお料理しないのに台所...
-
次のhtml・cssでspan内の文字を...
-
Jupyter notebookですわかりま...
-
下記問題の答えが"D"になる意味...
-
改行含むテキストの表示の仕方
-
JaneStyleのスレッドが見れなく...
-
キー入力について
-
jdk17.06のインストーラーが起...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列にnullを代入すると、null...
-
マイクラでPythonのプログラミ...
-
プログラミングの問題です。大...
-
下記のリストならno002が含まれ...
-
サーブレットをapacheで公開す...
-
Eclipse 動的プロジェクトで404...
-
正規表現について質問です。 カ...
-
eclipseで作ったプログラムを他...
-
Processingでマウスクリックで...
-
「main メソッドを持つクラスが...
-
eclipse実行ができない
-
直し方について教えて頂きたい...
-
質問です。 配列が100以上の場...
-
is this even a thing?
-
えハミルトン路と全域木のちが...
-
list の空は [] ってあわらすのに
-
プログラミングのプの字も知り...
-
StringReaderのサンプルプログ...
-
JSFタグのfタグとは
-
問題作成のWebアプリの作り方を...
おすすめ情報