- - PR -
文字列で、正規表現に一致した部分を配列で取得するには…
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-03-17 15:12
いつも、みなさまの記事を拝見させていただき、参考にさせていただいております。
今回、どうしても自分で納得のいかない処理の仕方をしてしまっているため、 みなさんのお知恵をお借りしたいです。 件名にも書きましたが、やりたいことは、 文字列の中から、正規表現に一致する部分を全て抜き出して、配列に形式で取得したいのです。 今のところ、処理自体は、以下のようにして解決しています。 1.正規表現で一致する位置を確認する。 2.正規表現の最後の部分を探して、そこまでの文字列を取得する。 3.1〜2を繰り返して、文字列を最後まで、走査する。 もっとスマートな解法がないか、いろいろ調べたのつもりなのですが、 この方法しか思いつきませんでした。 このような場合に、もっと良い方法があるとか、便利な関数が既に存在するなど、 みなさまのご意見をお聞かせいただけないでしょうか。 よろしくお願いします。 | ||||||||||||
|
投稿日時: 2006-03-17 15:19
追加で、具体的な例を書いておきます。
(現在の作り方) String regex = "<.*>"; String str = "抜き出さない部分1<抜き出したい部分1>抜き出さない部分2<抜き出したい部分2>"; String[] strs = MyStringUtils.getStrings( str, regex ); MyStringUtilsは、自作のクラスです。 getStringsは、{"<抜き出したい部分1>", "<抜き出したい部分2>"}という形式で作っています。 | ||||||||||||
|
投稿日時: 2006-03-17 15:35
まずは、
を
に変更してはどうでしょうか。 これで、端っこから順番にマッチさせていくことができるなら、 スマートなループが作れると思います。 | ||||||||||||
|
投稿日時: 2006-03-17 15:35
Javaでやるんですよね?
とすると地道に'(',')'とendプロパティを使って開始位置をずらしながら マッチングを繰り返す方法になると思いますが
これ、本当に抜き出したい部分だけ取れます?
でないと、後ろのほうまでマッチが進むと思うんですが。 #PythonとかPerl, Ruby なら一発で全部取れるんですけどねえ。 | ||||||||||||
|
投稿日時: 2006-03-17 15:57
Jakarta-OROのPerl5Utilクラスなら、matchメソッドを呼ぶ度に 次の候補から始まります。標準だとMatcher.findメソッドあたり? endプロパティを使用せずに、正規表現クラスとループだけで行 けると思います。 [ メッセージ編集済み 編集者: 悠 編集日時 2006-03-17 15:58 ] | ||||||||||||
|
投稿日時: 2006-03-17 16:27
どもです。
Jakartaは知らないのでぐぐってドキュメントを見てみましたが、 matchメソッドを呼び出すたびに開始位置がずれるというのは 見つけられませんでした。疑ってるわけではありませんが ポインタを示していただけませんか? で、そのドキュメントで見つけたんですが
これひとつですんじゃいそうな気が。 追記: Matcher (Java 2 プラットフォーム SE v1.4.0) に
というのがありますね。 確かにループ組むだけですみますね。 [ メッセージ編集済み 編集者: paniponi-x 編集日時 2006-03-17 16:33 ] | ||||||||||||
|
投稿日時: 2006-03-17 16:34
> Edossonさん,paniponi-xさん
すいません。 正規表現間違えていました。 実行確認前に書き込んでしまいました。 String str = "<.*?>"; でないとダメですね。 恥ずかしい限りです。 > 悠さん ありがとうございます。 Matcher.findなどを、使いながら、作り変えてみます。 皆さんの意見を参考にしながら、作り変えてみます。 Stringクラスのsplit(regex)メソッドも見てみたのですが、Matcherのfind()とend()を繰り返す形式でいいと思いました。 みなさん、適切なアドバイス、ありがとうございました。 | ||||||||||||
|
投稿日時: 2006-03-17 16:41
こんな感じになるのかな。 |