Java Pattern Matcher 正则应用

转自:http://www.itzhai.com/java-notes-regex-matches-and-lookingat.html#read-more

1、基本语法

2、String内建的正则表达式功能

  2.1、String类自带的正则表达式工具

    2.1.1、split方法

    2.1.2、字符串替换之replaceFirst和replaceAll方法

3、创建正则表达式:

  3.1、Pattern和Matcher

    3.1.2、matches()与lookingAt()的使用

  3.2、Group

  3.3、Pattern标记

  3.4、split()方法

  3.5、替换操作

  3.6、reset()方法

4、正则表达式与Java I/O

本文主要内容:

  1. 正则表达式最基本的语法;
  2. String内建的正则表达式功能,常用方法:split(), replaceFirst(), replaceAll();
  3. 使用Java创建正则表达式,相关类:Pattern, Matcher, Group;
  4. Pattern标记的介绍,使用Pattern.complie(String regex, int flag)给正则表达式指定模式;
  5. Pattern中的split方法,与String中的split类似;
  6. Matcher的替换操作,常用方法:replaceAll(String replacement), replaceFirst(String replacement), appendReplacement(StringBuffer sb, String replacement) , appendTail(StringBuffer sb);
  7. Matcher中reset()方法的使用;
  8. 在JAVA I/O中使用正则表达式。

  很久以前,正则表达式就整合到了Unix工具集中,例如sed和awk,也整合到了Python和Perl之类的程序设计语言中。Java中的字符串操作还主要集中在String,StringBuffer和StringTokenizer类,提供的功能相比于正则表达式简单有限。

1、基本语法:


关于Java中的正则表达式详细的语法,可以参考JDK文档。

\\  在其他语言中\\表示在正则表达式中插入一个普通的反斜线,而Java中则表示插入正则表达式的反斜线,所以其后的字符具有特殊的意义。
\\d  表示一位数字
\\\\  表示普通的反斜线
\n\t  表示换行和制表符,只需要使用单反斜线
-?\\d+  表示可能有一个负号,后面跟着一位或多位数字

2、String内建的正则表达式功能:


String str ="-123";
boolean isNum = str.matches("(-|\\+)?\\d+");// 可能包含负号或者正号的整数
System.out.println(isNum);// output: true

2.1、String类自带的正则表达式工具:

  2.1.1、split方法:

    这是String中提供的一个非常有用的正则表达式工具,作用是将字符串从正则表达式匹配的地方分开。

// split方法演示
String content ="Hello, this is an iPad.";
String[] items = content.split("\\W+");// 使用非单词字符分割字符串
System.out.println(Arrays.toString(items));
// [Hello, this, is, an, iPad]  可以发现逗号也被当做分隔符给去掉了
// split方法的重载版本,允许你限制字符串分割的次数
items = content.split("\\W+",3);
System.out.println(Arrays.toString(items));
// [Hello, this, is an iPad.]

  2.1.2、字符串替换之replaceFirst和replaceAll方法:

// 字符串的替换  replaceFirst和replaceAll方法
String str ="You make me cry, make me smile.";
System.out.println(str.replaceFirst("m\\w+","music"));// You music me cry, make me smile.
System.out.println(str.replaceAll("make|me","music"));// You music music cry, music music smile.

3、创建正则表达式:

  3.1、Pattern和Matcher:

    为了更加方便的使用正则表达式,强烈建议多去浏览JDK文档中java.util.regex.Pattern那一页的内容。

    下面是一个用Java创建正则表达式的例子:

String content ="one step tototoo far.";
// 编译正则表达式生成一个Pattern对象
Pattern p =Pattern.compile("(to){2,}");
// 用Pattern对象的matcher()方法检索字符串,生成Matcher对象
Matcher m = p.matcher(content);while(m.find()){
  System.out.println("Match \""+ m.group()+"\" ad position "+ m.start()+"-"+(m.end()-1));// output: Match "tototo" ad position 9-14
}

    使用Matcher上的各种方法,可以判断各种不同类型的匹配是否成功:

    boolean matches(): 

      尝试将整个区域与模式匹配。

      如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。

      返回:

      当且仅当整个区域序列匹配此匹配器的模式时才返回 true。

    boolean lookingAt(): 

    尝试将从区域开头开始的输入序列与该模式匹配。

    与 matches 方法类似,此方法始终从区域的开头开始;与之不同的是,它不需要匹配整个区域。

    如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。

    返回:

    当且仅当输入序列的前缀匹配此匹配器的模式时才返回 true。

    boolean find(): 

尝试查找与该模式匹配的输入序列的下一个子序列。

此方法从匹配器区域的开头开始,如果该方法的前一次调用成功了并且从那时开始匹配器没有被重置,则从以前匹配操作没有匹配的第一个字符开始。

如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。

返回:

当且仅当输入序列的子序列匹配此匹配器的模式时才返回 true。

boolean find(int start): 

重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列。

如果匹配成功,则可通过 start、end 和 group 方法获取更多信息,而 find() 方法的后续调用将从此匹配操作未匹配的第一个字符开始。

返回:

当且仅当从给定索引开始的输入序列的子序列匹配此匹配器的模式时才返回 true。

抛出:

IndexOutOfBoundsException- 如果开始点小于零或大于输入序列的长度。

下面是一个使用 boolean find(int start)的例子:

// boolean find(int start)
String content ="wings you are the hero~";
Pattern p =Pattern.compile("\\w+");
Matcher m = p.matcher(content);
int i=0;
while(m.find(i)){
  System.out.print(m.group()+" ");
    i++;
}

输出内容为:

wings ings ngs gs s you you ou u are are re e the the he e hero hero ero ro o

  

  .

  . 

  . 请查看原文章

  .

  .

3.5、替换操作:

  主要看到Matcher的以下几个方法:

replaceAll

public String replaceAll(String replacement)
替换模式与给定替换字符串相匹配的输入序列的每个子序列。 

replaceFirst

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

appendReplacement

public Matcher appendReplacement(StringBuffer sb,
                                 String replacement)
实现非终端添加和替换步骤。此方法执行以下操作:

  1. 它从添加位置开始在输入序列读取字符,并将其添加到给定字符串缓冲区。在读取以前匹配之前的最后字符(即位于索引 start() - 1 处的字符)之后,它就会停止。
  2. 它将给定替换字符串添加到字符串缓冲区。
  3. 它将此匹配器的添加位置设置为最后匹配位置的索引加 1,即 end()

appendTail

public StringBuffer appendTail(StringBuffer sb)
实现终端添加和替换步骤。此方法从添加位置开始从输入序列读取字符,并将其添加到给定字符串缓冲区。可以在一次或多次调用 appendReplacement 方法后调用它来复制剩余的输入序列。

下面通过一个程序来演示一下这几个方法的使用,并且通过这个程序,更加熟悉正则表达式的使用:

String content = "/*! long   long  ago, the is a man called Jack, \n" +
    " he has one boat. !*/";
// Pattern.DOTALL: 这种模式下 . 可以匹配任何字符,包括换行符
Pattern p = Pattern.compile("/\\*!(.*)!\\*/", Pattern.DOTALL);
Matcher m = p.matcher(content);
if(m.find())
    // 匹配到/*! !*/中的内容
content = m.group(1);
// 把两个以上空格的地方缩减为一个空格
content = content.replaceAll(" {2,}", " ");
// 开启多行模式,删除每一行开头部分的空格,+表示匹配一个或多个
content = content.replaceAll("(?m)^ +", "");
// 匹配到字符串中的第一个元音字母,并替换为VOWEL
content = content.replaceFirst("[aeiou]", "VOWEL");
// 下面一段程序演示把字符串中的所有元音字母替换为大写
Pattern p1 = Pattern.compile("[aeiou]");
Matcher m1 = p1.matcher(content);
StringBuffer sb = new StringBuffer();
while(m1.find()){
    // 非终端添加和替换,
    m1.appendReplacement(sb, m1.group().toUpperCase());
}
// 终端添加和替换
m1.appendTail(sb);
System.out.println(sb);

输出结果为:

lVOWELng lOng AgO, thE Is A mAn cAllEd JAck,
hE hAs OnE bOAt.

注意,上面的两个替换操作都只使用了一次replaceAll(),所以,与其编译为Pattern,不如直接使用StringreplaceAll()方法,而且开销也比较小。

  .

  .

  .

  .

时间: 2024-10-27 08:37:38

Java Pattern Matcher 正则应用的相关文章

Java 中的正则(Pattern)

/**String 中 replaceAll(),matches(),split() 等方法,都是调用Pattern中的方法.学习了,瞬间觉得Pattern强大了 public String replaceAll(String regex, String replacement) { return Pattern.compile(regex).matcher(this).replaceAll(replacement); } public boolean matches(String regex)

java Pattern和Matcher详解

结论:Pattern与Matcher一起合作.Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持. 单独用Pattern只能使用Pattern.matcher(String regex,CharSequence input)一种最基础最简单的匹配. Java正则表达式通过java.util.regex包下的Pattern类与Matcher类实现(建议在阅读本文时,打开JavaAPI文档,当介绍到哪个方法时,查看java API中的方法说明,效果会更佳). Pattern

正则Pattern Matcher compile matcher find group(.*?)

public static void main(String[] args) { String str = "http://funds.hexun.com/2015-05-28/176237903.html"; Pattern pattern = Pattern.compile("http:\\/\\/(.*?)\\.hexun\\.com(.*?)\\.html"); Matcher matcher = pattern.matcher(str); while (m

Java基础——字符串正则及Scanner

1.正则表达式 1.1.基础 字符串处理问题一般集中在匹配.选择.编辑于验证上,而正则表达式提供了一种完全通用的方式来解决这些问题 正则表达式就是以某种模式描述字符串,因此你可以说:“如果一个字符串含有这些东西,那么它就是我要找的东西”.例如我们可以用一下模式匹配数字:(-|\\+)?\\d+,他可以匹配任意整数. 测试如下: public class IntegerMatch { public static void main(String[] args) { System. out.prin

java:使用正则提取字符串中的数字(例如提取短信中的验证码)

使用java正则可以很方便的从字符串中提取符合条件的内容. 1.提取字符串中所有的手机号: private void getPhoneNum(String smsBody) { Pattern pattern = Pattern.compile("(13|14|15|18)\\d{9}"); Matcher matcher = pattern.matcher(smsBody); while (matcher.find()) { System.out.println(matcher.gr

Java代码使用正则验证和常用工具方法

1.正则验证邮箱 public static boolean checkEmail(String email){ boolean flag = false; try{ String check = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$"; Pattern regex = Pattern.compile(check); Matcher matcher = r

java中的正则操作总结

http://www.cnblogs.com/nerxious/archive/2013/01/03/2842910.html 正则表达式在处理字符串的效率上是相当高的 关于正则表达式的使用,更多的是自己的经验,有兴趣可以参阅相关书籍 这里主要写一下java中的正则操作方法 实例1:匹配 import java.util.Scanner; class Demo { public static void main(String[] args) { Scanner sc = new Scanner(

正则,String中用法,Pattern Matcher

package com.正则表达式; import java.util.Scanner; /** * * 校验qq号码 * 1:要求必须是5-15位数字 * 2: 0不能开头 * 分析: * A:键盘录入qq号码 * B:写一个功能 * C:调用功能,输出结果 * */ public class RegexDemo { public static void main(String[] args){ Scanner sc=new Scanner(System.in); System.out.pri

Java 正则表达式 Pattern&Matcher

通常会有这种需求: 在文档中搜索有规律的字符串,然后进行统计或者替换.Java.util.regex包下的Pattern和Matcher这两个类提供了通过正则表达式来匹配查询,甚至替换的功能.那么我们接下来就举个栗子吧 : 栗子1:查找文件中以img_数字.png格式的字符串,并在前面添加路径: /test/img/ package test; import java.io.File; import java.util.regex.Matcher; import java.util.regex.