在这一节中来看看 Matcher 类中其他一些有用的方法。方便起见,下面列出的方法是按照功能来分组的。

索引方法

索引方法(index methods)提供了一些正好在输入字符串中发现匹配的索引值:

public int start():返回之前匹配的开始索引。

public int start(int group):返回之前匹配操作中通过给定组所捕获序列的开始索引。

public int end(): 返回最后匹配字符后的偏移量。

public int end(int group): 返回之前匹配操作中通过给定组所捕获序列的最后字符之后的偏移量。

研究方法

研究方法(study methods)回顾输入的字符串,并且返回一个用于指示是否找到模式的布尔值。

public boolean lookingAt(): 尝试从区域开头处开始,输入序列与该模式匹配。

public boolean find(): 尝试地寻找输入序列中,匹配模式的下一个子序列。

public boolean find(int start): 重置匹配器,然后从指定的索引处开始,尝试地寻找输入序列中,匹配模式的下一个子序列。

public boolean matches(): 尝试将整个区域与模式进行匹配

替换方法

替换方法(replacement methods)用于在输入的字符串中替换文本有用处的方法。

public Matcher appendReplacement(StringBuffer sb, String replacement):实现非结尾处的增加和替换操作。

public StringBuffer appendTail(StringBuffer sb):实现结尾处的增加和替换操作。

public String replaceAll(String replacement):使用给定的替换字符串来替换输入序列中匹配模式的每一个子序列。

public String replaceFirst(String replacement):使用给定的替换字符串来替换输入序列中匹配模式的第一个子序列。

public static String quoteReplacement(String s):返回指定字符串的字面值来替换字符串。这个方法会生成一个字符串,用作 Matcher 的 appendReplacement 方法中的字面值替换 s。所产生的字符串将与作为字面值序列的 s 中的字符序列匹配。斜线(\)和美元符号($)将不再有特殊意义了。

9.1 使用 start 和 end 方法

示例程序 MatcherDemo.java 用于计算输入序列中单词“dog”的出现次数。

import java.util.regex.Pattern;

import java.util.regex.Matcher;

public class MatcherDemo {

private static final String REGEX = "\\bdog\\b";

private static final String INPUT = "dog dog dog doggie dogg";

public static void main(String[] args) {

Pattern p = Pattern.compile(REGEX);

Matcher m = p.matcher(INPUT); // 获得匹配器对象

int count = 0;

while (m.find()) {

count++;

System.out.println("Match number " + count);

System.out.println("start(): " + m.start());

System.out.println("end(): " + m.end());

}

}

}

输出:

Match number 1

start(): 0

end(): 3

Match number 2

start(): 4

end(): 7

Match number 3

start(): 8

end(): 11

可以看出,这个例子使用了单词边界,用于确保更长单词中的字母“d”“o”“g”就不是子串了。它也输出了一些有用的信息,在输入的字符串中什么地方

有匹配。start 方法返回在以前的匹配操作期间,由给定组所捕获子序列的开始处索引,end 方法返回匹配到最后一个字符索引加 1。

9.2 使用 matches 和 lookingAt 方法

matches 和 lookingAt 方法都是尝试该模式匹配输入序列。然而不同的是,matches 要求匹配整个输入字符串,而 lookingAt 不是这样。这两个方法都是从输入字符串的开头开始的。下面是 MatchesLooking.java 完整的代码:

import java.util.regex.Pattern;

import java.util.regex.Matcher;

public class MatchesLooking {

private static final String REGEX = "foo";

private static final String INPUT = "fooooooooooooooooo";

private static Pattern pattern;

private static Matcher matcher;

public static void main(String[] args) {

// 初始化

pattern = Pattern.compile(REGEX);

matcher = pattern.matcher(INPUT);

System.out.println("Current REGEX is: " + REGEX);

System.out.println("Current INPUT is: " + INPUT);

System.out.println("lookingAt(): " + matcher.lookingAt());

System.out.println("matches(): " + matcher.matches());

}

}

输出:

Current REGEX is: foo

Current INPUT is: fooooooooooooooooo

lookingAt(): true

matches(): false

9.3 使用 replaceFirst(String) 和 replaceAll(String) 方法

replaceFirst 和 replaceAll 方法替换匹配给定正则表达式的文本。从它们的名字可以看出,replaceFirst 替换第一个匹配到的,而 replaceAll 替换所有匹配的。下面是 ReplaceDemo.java 的代码:

import java.util.regex.Pattern;

import java.util.regex.Matcher;

public class ReplaceDemo {

private static String REGEX = "dog";

private static String INPUT = "The dog says meow. All dogs say meow.";

private static String REPLACE = "cat";

public static void main(String[] args) {

Pattern p = Pattern.compile(REGEX);

Matcher m = p.matcher(INPUT); // 获得匹配器对象

INPUT = m.replaceAll(REPLACE);

System.out.println(INPUT);

}

}

输出:

The cat says meow. All cats say meow.

在上面的例子中,所有的 dog 都被替换成了 cat。但是为什么在这里停下来了呢?你可以替换匹配任何正则表达式的文本,这样优于替换一个简单的像 dog 一样的文字。这个方法的 API 描述了“给定正则表达式a*b,在输入‘aabfooaabfooabfoob’和替换的字符串是‘-’情况下,表达式的匹配器调用方法后,会产生成字符串‘-foo-foo-foo-’。”

import java.util.regex.Pattern;

import java.util.regex.Matcher;

public class ReplaceDemo2 {

private static String REGEX = "a*b";

private static String INPUT = "aabfooaabfooabfoob";

private static String REPLACE = "-";

public static void main(String[] args) {

Pattern p = Pattern.compile(REGEX);

Matcher m = p.matcher(INPUT); // 获得匹配器对象

INPUT = m.replaceAll(REPLACE);

System.out.println(INPUT);

}

}

输出:

-foo-foo-foo-

仅要替换模式一次时,可以简单地调用 replaceFirst 用于取代 replaceAll,它接受相同的参数。

9.4 使用 appendReplacement(StringBuffer, String) 和 appendTail(StringBuffer) 方法

Matcher 类也提供了 appendReplacement 和 appendTail 两个方法用于文本替换。下面的这个例子(RegexDemo.java)使用了这两个方法完成与 replaceAll 相同的功能。

import java.util.regex.Pattern;

import java.util.regex.Matcher;

public class RegexDemo {

private static String REGEX = "a*b";

private static String INPUT = "aabfooaabfooabfoob";

private static String REPLACE = "-";

public static void main(String[] args) {

Pattern p = Pattern.compile(REGEX);

Matcher m = p.matcher(INPUT); // 获得匹配器对象

StringBuffer sb = new StringBuffer();

while (m.find()) {

m.appendReplacement(sb, REPLACE);

}

m.appendTail(sb);

System.out.println(sb.toString());

}

}

输出:

-foo-foo-foo-

9.5 在 java.lang.String 中等价的 Matcher 方法

为了使用方便,String 类看上去还不错地模仿了 Matcher 的两个方法:

public String replaceFirst(String regex, String replacement):

使用给定的替换字符串替换该字符串中匹配了给定正则表达式的第一个子字符串。调用 str.replaceFirst(regex,

repl)方法与使用

Pattern.compile(regex).matcher(str).replaceFirst(repl)产生的结果是完全相同的。

public String replaceAll(String regex, String replacement):

使用给定的替换字符串替换该字符串中匹配了给定正则表达式的每一个子字符串。调用 str.replaceAll(regex, repl)方法与使用

Pattern.compile(regex).matcher(str).replaceAll(repl)产生的结果是完全相同的。

java matcher方法_9 Matcher 类的方法 - Java 正则表达式教程相关推荐

  1. java的属性只能在类里面 方法外面定义

    java的属性只能在类里面 方法外面定义 区别于python:python 既能在类里面(类属性) 又能在方法里面定义属性(实例属性) 转载于:https://www.cnblogs.com/clas ...

  2. Java中同一个文件里类和方法的引用

    Java中同一个文件里类和方法的引用 在项目开发时往往需要在同一个文件里创建几个类,并互相引用,但小白们搞不懂,所以我给大家讲解一下 目录 Java中同一个文件里类和方法的引用 1.权限修饰符 2.类 ...

  3. java throwable判断,判断(2分) Java语言中的所有异常类都是java.lang.Throwable的子类。...

    判断(2分) Java语言中的所有异常类都是java.lang.Throwable的子类. 更多相关问题 This artical is probably ________. 某企业2010年12月3 ...

  4. Java反射机制涉及的类常见方法使用总结

    1 import java.lang.reflect.Constructor; 2 import java.lang.reflect.*; 3 4 /*Class:代表一个字节码文件的对象,每当有类被 ...

  5. java怎么调用另一个类的方法_Java设计模式:十篇,代码小白必看

    Java设计模式(一)----单例模式 一.特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且 ...

  6. 学以致用——Java源码——使用Graphics2D类draw方法绘制立方体(Drawing Cubes)

    程序功能: 使用Graphics2D类draw方法绘制立方体 运行示例: 源码: 1. 实体类 import java.awt.Graphics2D; import java.awt.Polygon; ...

  7. java怎么调用另一个类的方法_在一个类中访问另一个类的方法

    在一个类中访问另一个类的方法 由于Java应用程序是由若干个类构成的,因此经常需要在一个类中访问另一个类中的成员和方法,请问应该如何在一个类中访问另一个类的方法?下面是由百分网小编为大家整理的在一个类 ...

  8. java怎么调用另一个类的方法_java如何调用另一个类的方法

    java调用另一个类的方法:1.类方法用static修饰,代码为[public static void sayStatic()]:2.没有static修饰的方法,代码为[ public void sa ...

  9. Java基础深度总结:Object类-clone方法

    凡心所向,素履所往,生如逆旅,一苇以航. 内容 1.clone概述 2.Cloneable接口 3.clone与new的区别 4.浅拷贝与深拷贝(重点) 5.Object.clone 6.浅拷贝存在的 ...

最新文章

  1. 【共振峰跟踪】通过平均不同分辨率的方法跟踪共振峰,基于时频lpc的频谱图的MATLAB仿真
  2. java 方法调用绑定
  3. [转]C#中得到程序当前工作目录和执行目录的一些方法
  4. 虚拟字符设备驱动开发步骤
  5. COMA(二):Counterfactual Multi-Agent Policy Gradients 论文讲解
  6. mysql数据库相互备份_MySQL的本地备份和双机相互备份脚本
  7. USACO-Section1.5 Arithmetic Progressions(枚举)
  8. 荣耀V30外观细节曝光:后置相机模组排布类似坚果Pro3
  9. 化工计算机软件基础考试题,化工原理模拟试题(一)及答案.doc
  10. seo 伪原创_seo文章优化(怎么样做好伪原创文章)
  11. 用c语言编写清理c盘程序,C盘清理小程序制作
  12. 基于SNN脉冲神经网络的Hebbian学习训练过程matlab仿真
  13. 雷视一体机助力智慧高速路侧感知建设
  14. CPU飙高和内存飙高等等的一般处理步骤
  15. python相减函数subs,SUBS(subs是什么函数)
  16. msp430发送pwm信号_MSP430F149学习之路——PWM信号
  17. 常用的计算机硬件软件英语,计算机英语常用词汇.ppt
  18. eclipse java验证码_spring整合kaptcha验证码
  19. openresty ngx_lua重定向
  20. ubuntu ceres-solver 安装

热门文章

  1. C#与安捷伦34970a巡检仪通讯
  2. 看门狗要素以及stm32看门狗
  3. MyCat数据库中间件
  4. div填充透明背景但是内容不透明
  5. SIKI学习——坦克大战06
  6. 2021年内蒙古高考成绩查询一分一段,2021年内蒙古高考成绩排名及一分一段表
  7. java实现排列组合算法
  8. 【CSS】样式化文字
  9. 微信分享闪退问题分析及解决
  10. c语言argc和argv的作用,c语言中int main(int argc, char argv)中argc和argv的作用