Java 正则表达式的使用

java.util.regex 包主要包括以下三个类:

Pattern 类:

  pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。

Matcher 类:

  Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。

PatternSyntaxException:

  PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。

  以下实例中使用了正则表达式.*runoob.*用于查找字符串中是否包含了runoob子串:

 package cc.bcy;

 import java.util.regex.*;

 public class RegexExample
{
public static void main(String[] args)
{
String content="I am noob from runoob.com";
String pattern=".*runoob.*";
boolean isMatch=Pattern.matches(pattern, content);
System.out.println("字符串中是否包含了‘runoob’子字符串?"+isMatch);
}
}
/*
字符串中是否包含了‘runoob’子字符串?true
*/

捕获组:

  捕获组是把多个字符当一个单独单元进行处理的方法,它通过对括号内的字符分组来创建。可以通过调用 matcher 对象的 groupCount 方法来查看表达式有多少个分组。groupCount 方法返回一个 int 值,表示matcher对象当前有多个捕获组。

  还有一个特殊的组(group(0)),它总是代表整个表达式。该组不包括在 groupCount 的返回值中。

 package cc.bcy;

 import java.util.regex.*;

 public class RegexExample
{
public static void main(String[] args)
{
String line="This order was placed for QT3000! OK?";
String pattern="(\\D*)(\\d+)(.*)";
//创建Pattern对象
Pattern p=Pattern.compile(pattern);
//创建Matcher对象
Matcher m=p.matcher(line);
if(m.find())
{
System.out.println("Found value: "+m.group(0));
System.out.println("Found value: "+m.group(1));
System.out.println("Found value: "+m.group(2));
System.out.println("Found value: "+m.group(3));
}
else
{
System.out.println("No Match!");
}
int n=m.groupCount();
System.out.println("一共有"+n+"个捕获组");
}
}
/*
Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT
Found value: 3000
Found value: ! OK?
一共有3个捕获组
*/

Java 正则表达式语法:

  在其他语言中,\\ 表示:我想要在正则表达式中插入一个普通的(字面上的)反斜杠,请不要给它任何特殊的意义。

  在 Java 中,\\ 表示:我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。

  所以,在其他的语言中(如Perl),一个反斜杠 \ 就足以具有转义的作用,而在 Java 中正则表达式中则需要有两个反斜杠才能被解析为其他语言中的转义作用。也可以简单的理解在 Java 的正则表达式中,两个 \\ 代表其他语言中的一个 \,这也就是为什么表示一位数字的正则表达式是 \\d,而表示一个普通的反斜杠是 \\\\。

Matcher 类的方法

  

下面是一个对单词 "cat" 出现在输入字符串中出现次数进行计数的例子:

 package cc.bcy;

 import java.util.regex.*;

 public class RegexExample
{
private static final String REGEX="\\bcat\\b";
private static final String INPUT="cat cat cat cattie cat";
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());
System.out.println();
}
}
}
/*
Match number 1
start() 0
end() 3 Match number 2
start() 4
end() 7 Match number 3
start() 8
end() 11 Match number 4
start() 19
end() 22
*/

  matches 和 lookingAt 方法都用来尝试匹配一个输入序列模式。它们的不同是 matches 要求整个序列都匹配,而lookingAt 不要求。lookingAt 方法虽然不需要整句都匹配,但是需要从第一个字符开始匹配。

  

  把字符串中的匹配项全部替换成“-”:(用appendReplacement()方法)

 package cc.bcy;

 import java.util.regex.*;

 public class RegexExample
{
private static final String REGEX="a*b";
private static final String INPUT="aabfooaabfooabfoobkkk";
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, "-");
}
m.appendTail(sb);
System.out.println(sb.toString());
}
}
/*
-foo-foo-foo-kkk
*/

  replaceFirst 和 replaceAll 方法用来替换匹配正则表达式的文本。不同的是,replaceFirst 替换首次匹配,replaceAll 替换所有匹配。

 package cc.bcy;

 import java.util.regex.*;

 public class RegexExample
{
private static final String REGEX="dog";
private static final String INPUT="The dog says meow. All dogs say meow.";
public static void main(String[] args)
{
Pattern p=Pattern.compile(REGEX);
Matcher m=p.matcher(INPUT);
String str=m.replaceAll("cat");
System.out.println(str);
}
}
/*
The cat says meow. All cats say meow.
*/

PatternSyntaxException 类的方法:

  PatternSyntaxException 是一个非强制异常类,它指示一个正则表达式模式中的语法错误。 PatternSyntaxException 类提供了下面的方法来帮助我们查看发生了什么错误。

  

Java 正则表达式的使用的更多相关文章

  1. java正则表达式

    java正则表达式 1.Java正则表达式的语法与示例:  http://baike.xsoftlab.net/view/207.html 2.Java 正则表达式:  http://www.runo ...

  2. Java正则表达式入门——转自RUNOOB.COM

    Java 正则表达式 正则表达式定义了字符串的模式. 正则表达式可以用来搜索.编辑或处理文本. 正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别. Java正则表达式和Perl的是最为相似 ...

  3. Java 正则表达式详解

    Java 提供了功能强大的正则表达式API,在java.util.regex 包下.本教程介绍如何使用正则表达式API. 正则表达式 一个正则表达式是一个用于文本搜索的文本模式.换句话说,在文本中搜索 ...

  4. 【转】详解Java正则表达式语法

    (转自: http://www.jb51.net/article/76354.htm) 这篇文章主要介绍了Java正则表达式语法,包括常用正则表达式.匹配验证-验证Email是否正确以及字符串中查询字 ...

  5. java正则表达式【大全】

    [正则表达式]文本框输入内容控制整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$只能输入数字:"^[0-9]*$".只能输入n位的数字:"^\d{n}$& ...

  6. JAVA正则表达式:Pattern类与Matcher类详解(转)

    java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表 ...

  7. JAVA正则表达式:Pattern类与Matcher类详解

    java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表 ...

  8. Java 正则表达式[转载]

    PS:转载自CSDN博客看上去很美 众所周知,在程序开发中,难免会遇到需要匹配.查找.替换.判断字符串的情况发生,而这些情况有时又比较复杂,如果用纯编码方式解决,往往会浪费程序员的时间及精力.因此,学 ...

  9. Java正则表达式的应用

    在很多种情况下,我们都必须对字符串进行匹配,以便判断字符串的格式是否符合要求,对字符串中的内容进行提取.比如,我要从一段话aabdfe中,判断这段话是否有包含ab这个词,那么如果用if-else来判断 ...

  10. Java正则表达式实用教程

    java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.java.util.regex包主要包括以下三个类:Pattern.Matcher和PatternSynta ...

随机推荐

  1. python GIL锁、进程池与线程池、同步异步

    一.GIL全局解释器锁 全局解释器锁 在CPython中,全局解释器锁(GIL)是一个互斥锁,它可以防止多个本机线程同时执行Python代码.之所以需要这个锁,主要是因为CPython的内存管理不是线 ...

  2. 中移物联网onenet入门学习笔记1:资料获取

    onenet学习资料.视频.例程汇总:https://open.iot.10086.cn/bbs/thread-977-1-1.html onenet开发文档:https://open.iot.100 ...

  3. Leetcode 145. 二叉树的后序遍历

    题目链接 https://leetcode-cn.com/problems/binary-tree-postorder-traversal/description/ 题目描述 给定一个二叉树,返回它的 ...

  4. selenuim2模拟鼠标键盘操作

    有时候有些元素不便点击或者做其他的操作,这个时候可以借助selenium提供的Actions类,它可以模拟鼠标和键盘的一些操作,比如点击鼠标右键,左键,移动鼠标等操作.对于这些操作,使用perform ...

  5. android自动化测试之Monkey--从参数讲解、脚本制作到实战技巧

    视频: http://v.youku.com/v_show/id_XODcyMjM1MDA4.html?from=y1.2-1-87.4.4-1.1-1-2-3 PPT: http://www.doc ...

  6. MySQL主从复制(Master-Slave)

    MySQL数据库自身提供的主从复制功能可以方便的实现数据的多处自动备份,实现数据库的拓展.多个数据备份不仅可以加强数据的安全性,通过实现读写分离还能进一步提升数据库的负载性能. 下图就描述了一个多个数 ...

  7. luogu3690 【模板】Link Cut Tree (动态树)

    参考there和there 题单 #include <iostream> #include <cstdio> using namespace std; int n, m, va ...

  8. 树状数组 - BZOJ 1103 [POI2007]大都市

    bzoj 1103 [POI2007]大都市 描述 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员 Blue Mary也开始骑着摩托车传递邮件了.不过,她经常回忆起以前在乡间漫步的情景. ...

  9. Android library projects cannot be launched解决方法

    着了一个例子项目,总是报标题说的错误. 解决方法如下: 红圈的地方,勾掉. 貌似如果你这个项目是作为一个被引用的project的话, 要勾上这个.单独作为一个app的话,不能勾选这个. --不懂,瞎写 ...

  10. Uiautomator ---(1) 封装代码

    http://www.cnblogs.com/by-dream/p/4996000.html  上面是别人的写法 我自己的写法: package qq.test; import android.con ...