前言
java.util.regex
是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。它包括两个类:Pattern和Matcher
Pattern
一个Pattern是一个正则表达式经编译后的表现模式。 Matcher
一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。
首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作。
Pattern介绍
正则表达式的编译表示。
必须首先将正则表达式(指定为字符串)编译为此类的实例。 然后将所得的图案可以被用来创建一个Matcher对象可以匹配任意character sequences针对正则表达式。
执行匹配的所有状态都驻留在匹配器中,所以许多匹配者可以共享相同的模式。
所有方法:
Predicate<String> asPredicate() 创建可用于匹配字符串的谓词。
static Pattern compile(String regex) 将给定的正则表达式编译为模式。
static Pattern compile(String regex, int flags) 将给定的正则表达式编译为带有给定标志的模式。
int flags() 返回此模式的匹配标志。
Matcher matcher(CharSequence input) 创建一个匹配器,匹配给定的输入与此模式。
static boolean matches(String regex, CharSequence input) 编译给定的正则表达式,并尝试匹配给定的输入。
String pattern() 返回编译此模式的正则表达式。
static String quote(String s) 返回指定的 String的文字模式 String 。
String[] split(CharSequence input) 将给定的输入序列分成这个模式的匹配。
String[] split(CharSequence input, int limit) 将给定的输入序列分成这个模式的匹配。
Stream<String> splitAsStream(CharSequence input) 根据给定的输入序列创建一个流,该流与该模式匹配。
String toString() 返回此模式的字符串表示形式。
Matcher介绍
匹配器
Matcher appendReplacement(StringBuffer sb, String replacement) 实施非终端附加和替换步骤。
StringBuffer appendTail(StringBuffer sb) 实施终端附加和替换步骤。
int end() 返回最后一个字符匹配后的偏移量。
int end(int group) 返回在上次匹配操作期间由给定组捕获的子序列的最后一个字符之后的偏移量。
int end(String name) 返回给定捕获子序列的最后一个字符之后的偏移量 named-capturing group以前的匹配操作期间。
boolean find() 尝试找到匹配模式的输入序列的下一个子序列。
boolean find(int start) 重新设置该匹配器,然后尝试从指定的索引开始找到匹配模式的输入序列的下一个子序列。
String group() 返回与上一个匹配匹配的输入子序列。
String group(int group) 返回在上一次匹配操作期间由给定组捕获的输入子序列。
String group(String name) 返回给定捕获的输入子序列 named-capturing group以前的匹配操作期间。
int groupCount() 返回此匹配器模式中捕获组的数量。
boolean hasAnchoringBounds() 查询该匹配器的区域边界的锚定。
boolean hasTransparentBounds() 查询此匹配器的区域边界的透明度。
boolean hitEnd() 如果在匹配器执行的最后一次匹配操作中输入的结尾被搜索引擎命中,则返回true。
boolean lookingAt() 尝试将输入序列从区域开头开始与模式相匹配。
boolean matches() 尝试将整个区域与模式进行匹配。
Pattern pattern() 返回该匹配器解释的模式。
static String quoteReplacement(String s) 返回一个文字替换 String为指定的 String 。
Matcher region(int start, int end) 设置该匹配器区域的限制。
int regionEnd() 报告该匹配器区域的最终索引(排他)。
int regionStart() 报告该匹配器区域的开始索引。
String replaceAll(String replacement) 将与模式匹配的输入序列的每个子序列替换为给定的替换字符串。
String replaceFirst(String replacement) 将与模式匹配的输入序列的第一个子序列替换为给定的替换字符串。
boolean requireEnd() 如果更多输入可以将正匹配更改为否定,则返回true。
Matcher reset() 重设此匹配器。
Matcher reset(CharSequence input) 使用新的输入序列重置此匹配器。
int start() 返回上一个匹配的起始索引。
int start(int group) 返回给定组在上一个匹配操作期间捕获的子序列的开始索引。
int start(String name) 返回给定捕获的子序列的初始索引 named-capturing group以前的匹配操作期间。
MatchResult toMatchResult() 返回此匹配器的匹配状态为MatchResult 。
String toString() 返回此匹配器的字符串表示形式。
Matcher useAnchoringBounds(boolean b) 设置该匹配器的区域边界的锚定。
Matcher usePattern(Pattern newPattern) 更改,这 Matcher用于查找与匹配的 Pattern。
Matcher useTransparentBounds(boolean b) 设置此匹配器的区域边界的透明度。
测试数据
//测试1
String s="11.1斤巫妖王,12.2斤大螺丝,33斤死亡之翼,44.4斤狼人";
String regex="[0123456789.]+";//匹配数字与小数点的正则表达式的字符串
String regex2="\\d.+";
int number=0;
double sum=0.0;
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(s);
while(m.find()) {
System.out.println(m.group());
number=number+1;
try{
sum=sum+Double.parseDouble(m.group());
}
catch(NumberFormatException e){
System.out.println(e.getMessage());
}
}
System.out.println("循环次数"+number);
System.out.println("总数:"+sum); //哈哈 出现了浮点型精确度问题
//返回结果:
//11.1
//12.2
//33
//44.4
//循环次数4
//总数:100.69999999999999
//测试2
Pattern p2=Pattern.compile("([a-z]+)(\\d+)");
Matcher m2=p2.matcher("aaa2223bb");
System.out.println(m2.find());
System.out.println(m2.start(1)); //0 返回第一组匹配到的子字符串在字符串中的索引号
System.out.println(m2.start(2)); //3
System.out.println(m2.end(1)); //3 返回第一组匹配到的子字符串的最后一个字符在字符串中的索引位置
System.out.println(m2.end(2)); //7
System.out.println(m2.group()); //aaa2223
System.out.println(m2.group(1)); //aaa 匹配结果的第一个子字符串
System.out.println(m2.group(2)); //2223 匹配结果的第二个子字符串
System.out.println(m2.groupCount() ); //2 因为有2个子字符串