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 の環境変数の列挙( 含ソート )






