java.util.regex.Matcher java.util.regex.Pattern groupCount で取得されるのは、部分一致した数なので、() を使用しなければ、戻り値は 0 となります。また、その場合は group() で取得できますし。group(0) でも取得できます。 なので、常に pattern に一致する文字列は group(0) です。group(n) で n が 1 以上は部分一致となります。 よって、部分一致のみのループは、for( int i = 1; i <= m.groupCount(); i++ ) となります。
import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static void main(String[] args) { Pattern p; Matcher m; int len; print("処理開始"); // NAVER の RSS String str = httpGet("http://matome.naver.jp/feed/hot"); // 部分一致の無い パターンを生成 p = Pattern.compile("<title>.+?</title>"); m = p.matcher(str); // 部分一致した数( 0 になります ) len = m.groupCount(); print( Integer.toString(len) ); while(m.find()) { // 部分一致は無いので、m.group() で パターン // に対する全体一致を取得 System.out.println(m.group()); } print("------------------------------------------"); // 部分一致のあるパターンを生成 p = Pattern.compile("<title>(.+?)</title>"); m = p.matcher(str); // 部分一致した数 ( 1になります ) len = m.groupCount(); print( Integer.toString(len) ); while(m.find()) { // m.group(0) はパターンに対する全体一致なので // 1 から始めて部分一致のみ表示 for( int i = 1; i < (len +1); i++) { System.out.println(m.group(i)); } } print("------------------------------------------"); // 部分一致のあるパターンを生成 p = Pattern.compile("(<title>)(.+?)(</title>)"); m = p.matcher(str); len = m.groupCount(); print( Integer.toString(len) ); String partsString; StringBuilder buffer; while(m.find()) { buffer = new StringBuilder(); for( int i = 1; i < (len +1); i++) { // title 開始タグ if ( i == 1) { buffer.append("『"); } // title 内容 if ( i == 2) { partsString = m.group(2); // String クラスの正規表現置換 // 文の区切り的文字で改行 partsString = partsString.replaceAll("[。、.…!?]+", "\n"); buffer.append(partsString); } // title 終了タグ if ( i == 3) { buffer.append("』"); } } print(buffer.toString()); print(""); } } // ******************************** // データ表示用 // ******************************** public static void print( String s ) { System.out.println(s); } // ******************************** // static void main より呼び出す為の // static な インターネットアクセス関数 // ******************************** public static String httpGet( String s ) { String result = ""; try { URL url = new URL(s); HttpURLConnection http = (HttpURLConnection)url.openConnection(); http.setRequestMethod("GET"); http.connect(); InputStream is = http.getInputStream(); InputStreamReader isr = new InputStreamReader(is,"UTF8"); BufferedReader br = new BufferedReader(isr); String line_buffer; StringBuilder sb = new StringBuilder(); while(null != (line_buffer = br.readLine() )) { sb.append(String.format("%s\n",line_buffer)); } br.close(); isr.close(); is.close(); result = sb.toString(); } catch (Exception e) { e.printStackTrace(); } return result; } }
|
【Javaの最新記事】
- Java : Apache POI で最低限の処理を標準化( ここではワークブックは新規作成 )
- Java で JSON 文字列を オブジェクトに変換する Google Gson の基本 4 パターン
- Eclipse で、文字列内のファイルのパスの \ 記号を \\ にする方法
- Java : Google gson 2.3.1 で JSON 文字列を定義済みのクラスを使ってオブジェクト化
- Java : Google gson 2.3.1 で、JSON 文字列のフォーマットが解らなくてもなんとかなる『ベタ』な処理方法
- Eclipse のホバーで追加したライブラリの javadoc を表示させる手順
- Eclipse+WindowBuilder : DBアプリケーション(社員マスタメンテ)の更新(データ修正)処理
- Eclipse+WindowBuilder : DBアプリケーション(社員マスタメンテ)の入力チェック
- Eclipse+WindowBuilder : DBアプリケーション(社員マスタメンテ)の二会話画面制御
- Eclipse+WindowBuilder : DBアプリケーション(社員マスタメンテ)でDBからSELECT構文で行データを読み出す
- Eclipse+WindowBuilder : ボタンイベント(AbstractAction) の作成
- Eclipse+WindowBuilder : データベースアプリケーション(社員マスタメンテ)の画面作成
- Eclipse + WindowBuilder : JDBC と ODBC を使った、オールマイティなデータベース接続サンプル( MySQL / SQLServer / Oracle / Postgr..
- Eclipse + WindowBuilder : Design タブが表示されなくなった時の対処
- Eclipse のパンくずリスト(breadcrumb) をワークスペースの設定ファイルで非表示にする
- Java : Eclipse 実行の System.in.read(buff) でコンソール入力
- iText( itextpdf-5.4.3 / Java ) で簡単に PDF 出力をする。
- SQL 文へのデータバインド用 public class GetSQL
- ADT( Android Development Tools ) Eclipse に Window Builder をインストールして Swing アプリケーションを作成する(2)
- Java : Windows の環境変数の列挙( 含ソート )