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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
eclipseに記述したjavaファイル...
-
JPEG画像のみを印刷したいので...
-
importするには java.io.*; imp...
-
半透明の画像
-
HTMLファイルを開きたい
-
importとextendsの用い方の違い...
-
干支の計算で。。。
-
java リアルタイムでマウスの座...
-
「例外 *** は対応する try 文...
-
JavaでWindowsのタスクトレイに...
-
python OpenPyXLを使って出力結...
-
GridBagLayoutについての質問
-
ColabでのPytorchのエラー
-
Selenium IDEでexportしたコー...
-
フレームの×ボタンを押しても閉...
-
Java配列でNullPointerExceptio...
-
Path型をString型へ変換する(Java)
-
JSPやサーブレットでSystem.out...
-
オブジェクトの中のプロパティ...
-
csvファイルを2次元配列に格納
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
eclipseに記述したjavaファイル...
-
「例外 *** は対応する try 文...
-
Selenium IDEでexportしたコー...
-
ColabでのPytorchのエラー
-
setAttribute(String, int)は適...
-
Javaを使ってデジタル時計を作...
-
<forEach> 内で供給された "ite...
-
importするには java.io.*; imp...
-
importとextendsの用い方の違い...
-
do while文のエラー??
-
javaで警告音
-
ActionForm form にnullが入っ...
-
(急募) Java (CSVをしよう)一...
-
文字サイズが可変のラベル
-
JavaアプリでWWWサーバにアクセ...
-
生年月日と今日の日付から年齢...
-
正規表現について
-
import 文
-
Androidで画面遷移ができません.
-
【JAVAエラー】互換性のない型...
おすすめ情報