- PR -

文字列で、正規表現に一致した部分を配列で取得するには…

投稿者投稿内容
ゆう
常連さん
会議室デビュー日: 2003/06/27
投稿数: 45
投稿日時: 2006-03-17 16:55
引用:

Jakartaは知らないのでぐぐってドキュメントを見てみましたが、
matchメソッドを呼び出すたびに開始位置がずれるというのは
見つけられませんでした。疑ってるわけではありませんが
ポインタを示していただけませんか?



下記APIに載ってます。

org.apache.oro.text.perl.Perl5Util match
http://www.jajakarta.org/oro/ja/api/org/apache/oro/text/perl/Perl5Util.html#match(java.lang.String,%20org.apache.oro.text.regex.PatternMatcherInput)


以下、APIからの引用です。

引用:

このメソッドを呼んだ後は、PatternMatcherInput の現在のオフセット は、マッチの最後まで進みます。そして、 OROMatcherTM パッケージの中で説明されているように、 ループを用いてマッチを繰り返すことにより、 入力全体の正規表現のマッチを取得することができます。



とりあえず私自身が作ったアプリは、matchメソッドとループだけで動いています。
バグってる可能性もありますが、趣味ソフトなので気にしない。


[ メッセージ編集済み 編集者: 悠 編集日時 2006-03-17 16:57 ]
未記入
会議室デビュー日: 2005/07/15
投稿数: 11
投稿日時: 2006-03-17 17:10
皆さん、本当にありがとうございました。

みなさんの意見と、String.split(regex)のソースコードの組み合わせて、以下のようなソースになりました。

コード:

public static final String[] getSplitter( String str, String splitterRegex ){
Pattern pattern = Pattern.compile(splitterRegex);
return getSplitter(pattern, str);
}

private static String[] getSplitter(Pattern pattern, CharSequence input) {
int index = 0;
ArrayList<String> matchList = new ArrayList<String>();
Matcher m = pattern.matcher(input);

// Add segments before each match found
while(m.find()) {
matchList.add(m.group());
index = m.end();
}

// If no match was found, return this
if (index == 0)
return new String[0];

// Construct result
int resultSize = matchList.size();
while (resultSize > 0 && matchList.get(resultSize-1).equals(""))
resultSize--;
String[] result = new String[resultSize];
return matchList.subList(0, resultSize).toArray(result);
}




以前のソースと比べてかなり納得できるものになりました。
(以前のソースは、恥ずかしいので、提示を避けさせてください)

本当にありがとうございました。


[ メッセージ編集済み 編集者: 未記入 編集日時 2006-03-17 17:25 ]

[ メッセージ編集済み 編集者: 未記入 編集日時 2006-03-17 17:44 ]
paniponi-x
常連さん
会議室デビュー日: 2006/01/14
投稿数: 27
投稿日時: 2006-03-17 17:22
引用:

悠さんの書き込み (2006-03-17 16:55) より:

下記APIに載ってます。

org.apache.oro.text.perl.Perl5Util match
http://www.jajakarta.org/oro/ja/api/org/apache/oro/text/perl/Perl5Util.html#match(java.lang.String,%20org.apache.oro.text.regex.PatternMatcherInput)




ありがとうございます。
見当違いのところを探していたようです。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2006-03-17 18:27
ちなみに、正規表現 全置換では
.*?(<.*?>)[^<]*

$1\n
で、複数行にとれます。

スキルアップ/キャリアアップ(JOB@IT)