ターゲット文字列に繰り返しマッチ

前のページで確認したとおり、ターゲットの文字列にパターンを適用しマッチしているかどうか調べるにはMatcherクラスで定義されているfindメソッドを使います。

例えば次のように記述します。

String str = "Tomato is 100yen, Lemon is 80yen.";
String regex = "¥¥d.+?yen";
Pattern p = Pattern.compile(regex);

Matcher m = p.matcher(str);
if (m.find()){
  System.out.println("マッチしました");
}

findメソッドは最初に呼び出された時にターゲット文字列の最初からマッチするかどうかを見ていきます。よって今回の場合はまず"100yen"にマッチします。

Tomato is 100yen, Lemon is 80yen.

ここでもう一度findメソッドを呼び出してみます。findメソッドは前回の呼び出しが正常に終了した場合、前回のマッチで一致しなかった最初の文字からマッチするかどうかを確認します。つまり"100yen"の次の","の位置です。

Tomato is 100yen, Lemon is 80yen.
                ^この位置

","の位置からパターンにマッチするのは"80yen"です。

Tomato is 100yen, Lemon is 80yen.

ここでもう一度findメソッドを呼び出してみます。今度の場合も同じく前回のマッチで一致しなかった最初の文字からマッチするかどうかを確認します。つまり"80yen"の次の"."の位置です。

Tomato is 100yen, Lemon is 80yen.
                                ^この位置

"."の位置からパターンにマッチするのは存在しないため、findメソッドは失敗します。

このようにfindメソッドを使うことでパターンがターゲット文字列にマッチするかどうか確認することができ、さらにfindに成功した場合には続けて他にマッチするものがないか調べることができます。

findメソッドは成功すると戻り値としてtrueを返しますので、1つのターゲット文字列にマッチする文字列を順に取り出すには次のように記述することができます。

String str = "Tomato is 100yen, Lemon is 80yen.";
String regex = "¥¥d.+?yen";
Pattern p = Pattern.compile(regex);

Matcher m = p.matcher(str);
while(m.find()){
  System.out.println(m.group());
}

※ groupメソッドはマッチした文字列を取得するメソッドです。別のページで解説します。

サンプルプログラム

では実際に試してみます。

JSample6_1.java

import java.util.regex.Pattern;
import java.util.regex.Matcher;

class JSample6_1{
  public static void main(String args[]){
    String str = "Tomato is 100yen, Lemon is 80yen, Banana is 140yen.";

    String regex = "¥¥d.+?yen";
    Pattern p = Pattern.compile(regex);

    System.out.println("Target:" + str);
    System.out.println("Pattern:" + regex + "¥n");

    check(p, str);
  }

  private static void check(Pattern p, String target){
    Matcher m = p.matcher(target);

    while(m.find()){
      System.out.println("match:" + m.group());
    }
  }
}

ではコンパイルを行った上で実行してみます。

p6-1


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值