Htmlのタグの属性を正規表現を用いて取得しようとしています。
たとえば
<font size="2" face="MS 明朝">
の場合、
"2"と
"MS 明朝"
を取得したいのですが、
以下のように定義を "="から始まり、空白か">"迄と定義した所、
pattern = Pattern.compile("=(.*?)[ >]");
としてマッチングした所、
"2"と
"MS
がとれてしまいました。
"(ダブルクォーテーションの中の[ >](空白等)は判定しないような
定義に出来るのでしょうか。
宜しくお願いします。
No.4ベストアンサー
- 回答日時:
あー説明文を一生懸命かいていたら自分で解決していましたか(^^;
> (?<==)
> は前方一致ですね。つまり=から始まるもの。
> 但し、=自体は検索結果に含まれないんですね。
意味はあっていますが、通常「戻り読み」
(look-behind)等と呼ばれます。
Pattern (Java Platform SE 6)
http://java.sun.com/javase/ja/6/docs/ja/api/java …
だと「後読み」になってますね。
> (?=
> は後方一致で
これも、通常は「先読み」(look-ahead)と呼ばれます。
> (?: はグループ化で
そうです。
単なる ( と )でもグループ化はできますが、
それとの違いは後方参照(back reference)
ができるかどうかです。
(?: )によるグループは後方参照できません。
#その代わりちょっと高速
といったところです。
*? と * の違いは良いですよね?
この回答への補足
*と*?は範囲が違うでしょうか。
*は最大まで範囲をとる。
*?は最小の範囲をとる。
同じ?でも使われ方が違ったりするんですね。
色々説明して頂き本当に有難うございます。
正規表現は勉強しているとなかなか面白いです。
No.3
- 回答日時:
一番問題がなさそうな条件を考えてみました。
何か問題点 or 疑問点があれば補足に書いてください。
この後数時間ばかしネットにアクセスできないのでよろしくおねがいします。
import java.lang.*;
import java.util.regex.*;
public class Moge {
static public void main(String[] args) {
//String target = "<font size=\"2\" face=\"MS 明朝\">";
String target = "<font size=2 face=MS 明朝 width=84 colspan=2 valign=top>";
Pattern p = Pattern.compile("(?<==).*?(?=(?: +[^ =>]+=)|>)");
Matcher m = p.matcher(target);
while (m.find()) {
System.out.println("found: " + m.group(0));
}
}
}
found: 2
found: MS 明朝
found: 84
found: 2
found: top
この回答への補足
sakusaker7さん
本当に有難うございました。
無事結果を取得できました。
出来れば意味も把握しておきたく、色々調べてみましたが、
下記の意味がわかりませんでした。
(?<==).*?(?=(?: +[^ =>]+=)|>)
とりあえず括弧で区切ってみました。
(?<==)
.*?
(?=(?: +[^ =>]+=)|>)
2段目の .*? はなんとか意味が分かるのですが、
1段目の (?<==) の意味が分かりません。
3段目も同様に?の意味が分かりません。
?は前方の文字が0回か1回出現するという意味みたいですが、
今回はその使われ方じゃない気がします。
お手数をお掛けしますが、ご教授ください。
宜しくお願いします。
すいません。勉強不足で
一段目の
(?<==)
は前方一致ですね。つまり=から始まるもの。
但し、=自体は検索結果に含まれないんですね。
なるほどです。勉強になります。
(?=
は後方一致で
(?: はグループ化で
" +"
は空白が一回以上連続して、その次が空白か=か>以外のものが1回以上
連続していて=で終わるもの。
つまり、空白の次の文字列の最後が=になっているものか">"が後方一致の判定ですね。
なるほどです。すごいです。
勉強になりました。
有難うございました。
No.2
- 回答日時:
>今回WORDから自動生成されたHtmlを使用しているのですが、属性に'"'が付いてない場合があるようです。
なるほど。
ただ XHTMLでなくても
> 属性値に英数字(a-z, A-Z, 0-9)、ハイフン(-)、
> ピリオド(.)、アンダースコア(_)、コロン(:)
> 以外の文字を含むときは属性値をダブルクォーテーション(")
> もしくはクォーテーション(')で囲まなくてはなりません。
http://www.tohoho-web.com/html/memo/attr.htm
ということなので、
MS 明朝 というのはあまりにもナニですがまあ我慢するとして、
“MS 明朝”のように、間に入る空白はひとつだけ
とか限定条件を置いて良いですか?
=を含む文字列を属性の値としてクォートなしで
使う。なんて状況はちと考えたくないです。
No.1
- 回答日時:
> 以下のように定義を "="から始まり、空白か">"迄と定義した所、
なぜこのような定義に?
=の後の、'"'で囲まれた部分というのでは
都合が悪いですか?
import java.lang.*;
import java.util.regex.*;
public class Moge {
static public void main(String[] args) {
String target = "<font size=\"2\" face=\"MS 明朝\">";
Pattern p = Pattern.compile("(?<==)\"[^\"]+\"");
Matcher m = p.matcher(target);
while (m.find()) {
System.out.println("found: " + m.group(0));
}
}
}
実行結果:
found: "2"
found: "MS 明朝"
> "(ダブルクォーテーションの中の[ >](空白等)は判定しないような
> 定義に出来るのでしょうか。
できなかありませんが、一目でわかる記述にはならないので
あまりお勧めはできません。
#わかりやすい記述にするとパフォーマンスが悪いものになるし
この回答への補足
回答有難うございます。
今回WORDから自動生成されたHtmlを使用しているのですが、属性に'"'が付いてない場合があるようです。
> 以下のように定義を "="から始まり、空白か">"迄と定義した所、
このような定義ではなくてもいいのですが、
<td width=84 colspan=2 valign=top>
このようなケースもある為、
=の後の、'"'で囲まれた部分というのは駄目みたいです。
きちんと記述していないなくて申し訳ありませんが、
宜しくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
do while文のエラー??
-
ColabでのPytorchのエラー
-
Java swing RTFファイル 文字化...
-
「例外 *** は対応する try 文...
-
干支の計算で。。。
-
JavaでWindowsのタスクトレイに...
-
createImage()を使い コンパイル
-
アプレットが初期化されていま...
-
(急募)JavaカレンダーをGUI可に...
-
importするには java.io.*; imp...
-
正規表現について
-
Javaで常駐するソフトを作って...
-
JAVAサーブレット。 HTML...
-
(疑問+急募)Javaでフレーム入り...
-
(急募)Javaじゃんけんゲームで...
-
javaで質問です。 文字列2023/2...
-
[JAVA]try 内の変数を外で!?
-
オブジェクトの中のプロパティ...
-
変数を動的に利用するには?
-
byte型のマイナスの扱いについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
eclipseに記述したjavaファイル...
-
「例外 *** は対応する try 文...
-
<forEach> 内で供給された "ite...
-
importするには java.io.*; imp...
-
setAttribute(String, int)は適...
-
Javaを使ってデジタル時計を作...
-
ActionForm form にnullが入っ...
-
Selenium IDEでexportしたコー...
-
ColabでのPytorchのエラー
-
jFrameを使って複数の画面を生...
-
【JAVAエラー】互換性のない型...
-
importとextendsの用い方の違い...
-
干支の計算で。。。
-
python OpenPyXLを使って出力結...
-
シャットダウンフックが呼ばれない
-
ファイル名を動的に生成したい
-
Javaで常駐するソフトを作って...
-
(急募)JavaカレンダーをGUI可に...
-
フレームの×ボタンを押しても閉...
-
文字列を数式に
おすすめ情報