Java对正则表达式的支持主要体现在String、Pattern、Matcher和Scanner类。

 1.Pattern、Matcher

  先看一个Pattern和Matcher类使用正则表达式的例子。

public class PatternTest {    

    public static void main(String [ ] args) {
String testString = "abcabcabcdefabc";
String [] regexs = new String []{"abc+","(abc)+","(abc){2,}"}; for(String regex:regexs){
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(testString); System.out.println("test regex: " + regex);
while(m.find()){
System.out.println("match " + m.group() + " at position " + m.start() + "-" + (m.end() -1));
}
}
} }

  运行的结果为:

test regex: abc+
match abc at position 0-2
match abc at position 3-5
match abc at position 6-8
match abc at position 12-14
test regex: (abc)+
match abcabcabc at position 0-8
match abc at position 12-14
test regex: (abc){2,}
match abcabcabc at position 0-8

  先对几个正则表达式的含义进行解释:

  abc+:匹配abc或者abcc或者abccc等。

  (abc)+:根据贪婪原则,匹配1次或者多次连续的abc,匹配最长的字符串。

  (abc){2,}:abc至少出现2次,匹配abcabc或者abcabcabc等。

  测试一个字符串是否匹配某个正则表达式,可以使用下面的方法:

String testString = "abcabcabcdefabc";
System.out.println(Pattern.matches("abc+", testString));
System.out.println(Pattern.matches("abc+", "abccc"));

  输出结果为:false 和 true。

  查看子匹配的方法如下,使用group方法:

import java.util.regex.Matcher;
import java.util.regex.Pattern; public class PatternTest2 { public static void main(String [ ] args) {
String poem = "'Twas brillig,and the slithy toves\n" +
"Did gyre and gimble in the wabe.\n" +
"All mimsy were the borogoves,\n" +
"And the mome raths outgrabe."; Pattern p = Pattern.compile("(?m)(\\S+)\\s(\\S+\\s\\S+)$");
Matcher m = p.matcher(poem);
while(m.find()){
for(int i=0;i<= m.groupCount();i++){
System.out.print("[" + m.group(i) + "]");
}
System.out.println("");
}
} }

  输出的结果为:

[the slithy toves][the][slithy toves]
[in the wabe.][in][the wabe.]
[were the borogoves,][were][the borogoves,]
[mome raths outgrabe.][mome][raths outgrabe.]

  需要解释的是:

  (?m)指明了是多行模式,否则“$”只会指向结尾的位置,加上了(?m),“$”指向每行的结尾位置。

  (\\S+)\\s(\\S+\\s\\S+)$表示每行结尾处的3个字符,需要注意这里面还包含了2个子匹配,代码中用 m.group(i)获取了子匹配的内容。

  

  如果希望在匹配时忽略大小写和支持多行模式,应该使用下面的代码:

import java.util.regex.Matcher;
import java.util.regex.Pattern; public class PatternTest3 { public static void main(String [ ] args) {
String testString = "java hava regex\n" +
"JAVA hava regex\n" +
"Java hava regex"; Pattern p = Pattern.compile("^java",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
Matcher m = p.matcher(testString);
while(m.find()){
System.out.println(m.group());
}
}
}

  输出结果为:

java
JAVA
Java

  Pattern.CASE_INSENSITIVE(?i)--忽略大小写

  Pattern.MULTILINE(?m)--支持多行模式

  Pattern.COMMENTS(?x)--忽略大小写

  将匹配结果分割成数组,可以使用split方法,String的split方法 也支持正则表达式,如下面的例子:

public class RegexSplit {

    public static void main(String [ ] args) {
String testString = "This!!unusual use!!of exclamation!!points"; Pattern p = Pattern.compile("!!");
String [] sts = p.split(testString);
for(String st:sts){
System.out.print(st +"|");
}
System.out.println();
sts = p.split(testString,3);
for(String st:sts){
System.out.print(st+"|");
}
} }

  正则表达式的替换操作,replaceFirst和replaceAll,复杂的替换操作需要appendReplacement来完成,如下:

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern; public class RegexExam {
public static void main(String args[]) {
String template = "尊敬的客户${customerName}你好!本次消费金额${amount},"
+ "您帐户${accountNumber}上的余额为${balance},欢迎下次光临!";
HashMap<String, String> data = new HashMap<String, String>();
data.put("customerName", "刘明");
data.put("accountNumber", "888888888");
data.put("balance", "$1000000.00");
data.put("amount", "$1000.00");
try {
System.out.println(composeMessage(template, data));
}
catch (Exception e) {
e.printStackTrace();
}
} public static String composeMessage(String template, Map<String, String> data)
throws Exception {
//这里使用勉强式匹配.+?,使用贪婪式匹配.+结果是不正确的
String regex = "\\$\\{(.+?)\\}";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(template);
/*
* sb用来存储替换过的内容,它会把多次处理过的字符串按源字符串序
* 存储起来。
*/
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
String name = matcher.group(1);//键名
String value = (String) data.get(name);//键值
if (value == null) {
value = "";
}
else {
/*
* $和\都是特殊字符,表示字符$需要转义\$
* 要把 $ 替换成 \$ ,则要使用 \\\\\\$来替换,java中的\是特殊字符,用\\表示正则表达式中的\
* value的结果仍是一个正则表达式,会在下面使用
*/
value = value.replaceAll("\\$", "\\\\\\$");
//System.out.println("value=" + value);
}
/*
* 经过上面的替换操作,现在的 value 中含有 $ 特殊字符的内容被换成了"\$1000.00"
*/
matcher.appendReplacement(sb, value);
System.out.println("sb = " + sb.toString());
}
//最后还得要把尾串接到已替换的内容后面去,这里尾串为“,欢迎下次光临!”
matcher.appendTail(sb);
return sb.toString();
}
}

  运行的结果为:

尊敬的客户刘明你好!本次消费金额$1000.00,您帐户888888888上的余额为$1000000.00,欢迎下次光临!

  重置,将Mathcer对象应用于一个新的字符串:

import java.util.regex.Matcher;
import java.util.regex.Pattern; public class RegexReset { public static void main(String [ ] args) {
String str = "fix the rug with bags"; Pattern pattern = Pattern.compile("[frb][aiu][gx]");
Matcher matcher = pattern.matcher(str);
while(matcher.find()){
System.out.print(matcher.group() + " ");
}
System.out.println();
matcher.reset("fix the rig with rags");
while(matcher.find()){
System.out.print(matcher.group() + " ");
}
} }

  输出的结果为:

fix rug bag
fix rig rag

Java对正则表达式的支持(一)的更多相关文章

  1. Java对正则表达式的支持(二)

    正则表达式的主要用途: a.在目标字符串中找出匹配正则表达式的部分 b.校验目标字符串是否符合正则表达式,例如校验邮箱地址 c.在目标字符串中替换符合正则表达式的部分为其他的字符串 Scanner类是 ...

  2. java中正则表达式基本用法

    正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它 用以描述在查找文字主体时待匹配的一个或多个字符串.正则表达式作为 ...

  3. Java与正则表达式

    Java与正则表达式 标签: Java基础 正则 正如正则的名字所显示的是描述了一个规则, 通过这个规则去匹配字符串. 学习正则就是学习正则表达式的语法规则 正则语法 普通字符 字母, 数字, 汉字, ...

  4. 1000行代码徒手写正则表达式引擎【1】--JAVA中正则表达式的使用

    简介: 本文是系列博客的第一篇,主要讲解和分析正则表达式规则以及JAVA中原生正则表达式引擎的使用.在后续的文章中会涉及基于NFA的正则表达式引擎内部的工作原理,并在此基础上用1000行左右的JAVA ...

  5. java中正则表达式基本用法(转)

    https://www.cnblogs.com/xhj123/p/6032683.html 正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符( ...

  6. JS和PHP和JAVA的正则表达式的区别(java没有分解符,java中的转义字符是\\)

    JS和PHP和JAVA的正则表达式的区别(java没有分解符,java中的转义字符是\\) 一.总结 js正则:var patrn=/^[0-9]{1,20}$/; php正则:$pattern='/ ...

  7. js and java 中正则表达式的使用

    首先介绍一下js当中的几个关键的正则表达式: 1.js中的正则表达式校验 a: RegExp(如果这里有转义字符的话,需要使用“\\”) var patt1=new RegExp("e&qu ...

  8. Java中正则表达式的使用(常用的方法)

    这两天回想了一下正则表达式的使用,顺便就总结了一下java的javascript中使用正则表达式的用法,需要看javascript中使用正则的朋友可以看我的另一篇总结,下面我就简单的介绍一下java中 ...

  9. java基础---->java中正则表达式二

    跟正则表达式相关的类有:Pattern.Matcher和String.今天我们就开始Java中正则表达式的学习. Pattern和Matcher的理解 一.正则表达式的使用方法 一般推荐使用的方式如下 ...

随机推荐

  1. UESTC 1599 wtmsb【优先队列+排序】

    题目链接:UESTC 1599 wtmsb 题意:给你一组数,每一次取出两个最小的数,将这两个数的和放入这组数中,直到这组数只剩下一个,求最后剩下那个数的大小! 分析:比赛的时候首先我就看到这道题数据 ...

  2. HDU2289-Cup-二分

    Cup Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  3. BZOJ1758: [Wc2010]重建计划(01分数规划+点分治+单调队列)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1758 01分数规划,所以我们对每个重心进行二分.于是问题转化为Σw[e]-mid>=0, ...

  4. OpenStack Horizon创建虚拟机时增加虚拟机OS用户

    背景 通过OpenStack的Horizon使用镜像创建虚拟机(以Ubuntu为例),如果不知道镜像的用户名和密码,在创建好虚拟机之后,无法登录虚拟机的OS.因此,我们需要一种方法,创建虚拟机时增加用 ...

  5. UE4 内容示例网络同步Learn

    一, 1.1 Actor的复制 Actor中的Replicates ,为true时,服务器会把该Actor同步,显示在客户端中. 1.2 Switch Has Authority判断是客户端还是服务器 ...

  6. SDP(1):ScalikeJDBC-基本操作介绍

    简单来说:JDBC是一种开放标准的跨编程语言.跨数据库类型编程API.各类型数据库产品厂商都会按它的标准要求来提供针对自身产品的JDBC驱动程序.最主要的这是一套成熟的工具,在编程人员中使用很普及.既 ...

  7. Linux终端连接Linux服务器

    我们经常需要通过类UNIX下连接我们的Linux服务器.比如我的Mac下经常需要连接上Linux服务器.一般系统都提供了ssh支持,可以直接连接: 通过命令: ssh root@120.25.12.9 ...

  8. LNMP下FTP服务器的安装和使用(Pureftpd和Proftpd)

    FTP是网站文件维护中使用比较多的,目前LNMP一键安装包中有Pureftpd和Proftpd服务器安装脚本,LNMP默认不安装任何FTP服务器,需要用户自行安装(1.2开始不再提供proftpd的安 ...

  9. 如何把域名解析到网站空间IP上?

    建立网站首要就是要有一个域名和网站空间,怎么把这两者联系在一起呢?这就要通过域名解析,把域名指向空间的IP,让我们能够通过域名访问网站空间.通过域名解析把我们容易记住的域名转化成IP地址,由DNS服务 ...

  10. 语句、变量等js最基本知识

    JavaScript的最为基本知识 1语法 js是区分大小写的:标识符就是指变量.函数.属性的名字或者是参数,标识符可以是字母,下划线,美元符号,数字,注意第一个不能是数字:js采用的是驼峰大小格式: ...