K:java中正则表达式的使用说明及其举例

从Java1.4起,java核心API就引入了java.util.regex程序包来处理正则表达式,并使用该包下的相关类进行字符串的匹配、搜索、提取、分析结构化内容等工作。需要注意的是,正则表达式本身也是一个字符串,为此,只有经过正确编译之后的正则表达式才能用于其它字符串的匹配等工作。经过正确编译后的正则表达式将其称之为“模式”

java.util.regex类库主要包含了两个类:Pattern以及Matcher。

Pattern用于编译一个正则表达式并用于表示正则表达式经编译后的表现形式。由于java字符串是基于统一字符编码(Unicode)的,为此,正则表达式也适用于国际化的应用程序。

Matcher用于匹配字符序列与给定模式。

注意点:
Pattern是不可变的对象,是线程安全的,而Matcher是线程不安全的

Pattern类相关说明:

相关字段:

字段 说明
static int CANON_EQ 启用规范等价
static int CASE_INSENSITIVE 启用不区分大小写的匹配
static int COMMENTS 模式中允许空白和注释
static int DOTALL 启用dotall模式
static int LITERAL 启用模式的字面值解析
static int MULTILINE 启用多行模式
static int UNICODE_CASE 启用Unicode感知的大小写折叠
static int UNIX_LINES 启用Unix行模式

常用方法:

方法 相关说明
static Pattern compile(String regex) 将给定的正则表达式编译到模式中
static Pattern compile(String regex,int flags) 将给定的正则表达式编译到具有给定标志的模式中
(Pattern.CASE_INSENSITIVE 表示不区分大小写)
int flags() 返回此模式的匹配标识,其为Pattern类的相关字段的值
Matcher match(CharSequence input) 获取匹配器,input是输入的待处理的字符串
static boolean matches(String regex, CharSequence input) 快速的匹配调用,直接根据输入的正则表达式regex匹配字符序列input
String[] split(CharSequence input,int limit) 围绕此模式的匹配,分隔字符序列input,limit参数可以限制分隔的次数
String pattern() 返回在其中编译过此模式的正则表达式。
String toString() 返回此模式的字符串表示
  • 需要注意的是当调用Pattern实例的match(CharSequence input)方法返回一个匹配器Matcher实例的时候,其并未将字符串与本Pattern实例所代表的模式进行匹配。

    通过Pattern类调用matches(String regex,CharSequence inpit)静态方法的时候,其执行了模式的匹配,根据输入的正则表达式去匹配输入的字符序列,当字符序列符合所输入的正则表达式所表示的模式的时候,其返回true,否则返回false

    使用match(CharSequence input)和matches(String regex,CharSequence input)方法的主要区别在于match方法返回了一个Matcher对象,可以用来根据给定的模式去做更多的处理(例如根据给定的字符序列的位置进行匹配)。而matches方法只是简单的去用给定的正则表达式所表示的模式去匹配了整个输入的字符序列并返回匹配的结果。

Matcher类相关说明:

常用方法:

方法 相关说明
boolean matches() 对整个输入字符串进行模式匹配
boolean lookingAt() 对输入字符串的开始处进行模式匹配。当且仅当输入序列的前缀匹配此匹配器的模式时才返回 true。与 matches 方法类似,此方法始终从区域的开头开始;与之不同的是,它不需要匹配整个区域。
boolean find(int start) 从start处开始匹配模式
boolean find() 尝试查找与该模式匹配的输入序列的下一个子序列。
int grounpCount() 返回匹配后的分组数目
String replaceAll(String replacement) 用给定的replacement全部替代匹配的部份
String replaceFitrst(String replacement) 用给定的replacement替代第一次匹配的部份
Matcher appendReplacement(StringBuffer sb,String replacement) 根据模式用replacement替换相应的内容,并将匹配的结果添加到sb当前位置之后,其主要结合find()方法相互使用
StringBuffer appendTail(StringBuffer sb) 将输入序列中匹配之后的末尾字串添加到sb当前位置之后.
String group(int group) 返回在以前匹配操作期间由给定组(即group参数的值)捕获的输入子序列。
  • 以下部份用于演示相关实例

示例一:

String sb="java.*";
System.out.println(Pattern.matches(sb,"java"));
System.out.println(Pattern.matches(sb,"javas"));

ps: Pattern类的matches静态方法用于比较一个String是否匹配一个给定的模式。正则“java.*”表示用于匹配以“java”字符为前缀的字符串

示例二:

String[] dataArr = { "1", "10", "101", "1010", "100+" };
for (String str : dataArr)
{
	String patternStr = "\\d+";
	boolean result = Pattern.matches(patternStr, str);
	if (result)
	{
    	System.out.println("字符串" + str + "匹配模式" + patternStr + "成功");
	}
	else
	{
		System.out.println("字符串" + str + "匹配模式" + patternStr + "失败");
	}
}

ps:\\d表示的是匹配数字,(因为在java中\为转义字符,为此需要写成\\表示正则表达式的一个\字符)而+表示一次或多次,所以模式\\d+就表示一位或多位数字.
因此前四个能匹配上,最后一个因为+号是非数字字符而匹配不上.

示例三:

String str = "薪水,职位 姓名;年龄 性别";
String[] dataArr = str.split("[,\\s;]");
for (String strTmp : dataArr)
{
	System.out.println(strTmp);
}

ps:String类的split函数支持正则表达式,上例中模式能匹配”,”,单个空格,”;”中的一个,split函数能把它们中任意一个当作分隔符,将一个字符串劈分成字符串数组.

示例四:

String sb="boo:and:foo";
Pattern pattern=Pattern.compile("o");
String[] string=pattern.split(sb);
System.out.println(string.length);
for(String s:string)
{
	System.out.println(s);
}

ps:需要注意该方法和String类的split方法使用上的区别

示例五:

String str="10元 1000人民币 10000元 100000RMB";
str=str.replaceAll("(\\d+)(元|人民币|RMB)", "$1¥");
System.out.println(str);

ps:上例中,模式“(\\d+)(元|人民币|RMB)”按括号分成了两组,第一组\\d+匹配单个或多个数字,第二组匹配元,人民币,RMB中的任意一个,替换部分$1表示第一个组匹配的部分不变,其余组替换成¥,需要注意和正则表达式中的\1即回溯引用相互区分开来。

替换后的str为10¥ 1000¥ 10000¥ 100000¥

示例六:

//Pattern.CASE_INSENSITIVE表示忽略大小写
Pattern p = Pattern.compile("m(o+)n", Pattern.CASE_INSENSITIVE);
// 用Pattern类的matcher()方法生成一个Matcher对象
Matcher m = p.matcher("moon mooon Mon mooooon Mooon");
StringBuffer sb = new StringBuffer();
// 使用循环找出模式匹配的内容替换之,再将内容加到sb里
while (m.find())
{
	m.appendReplacement(sb, "moon");
}
// 最后调用appendTail()方法将最后一次匹配后的剩余字符串加到sb里;
m.appendTail(sb);
System.out.println("替换后内容是" + sb.toString());

ps:运行的结果是:替换后内容是moon moon moon moon moon

实例七:

String regex="<(\\w+)>(\\w+)</\\1>";
Pattern pattern=Pattern.compile(regex);
String input="<name>Bill</name><salary>50000</salary><title>GM</title>";
Matcher matcher=pattern.matcher(input);
while(matcher.find())
{
  System.out.println(matcher.group(2));
}

ps:\\1对应第一个小括号括起来的(\\w+).其为回溯引用。
matcher.group(2)用于表示得到的匹配的字符串的第二个子表达式的内容

实例八:

//此处的正则表达式使用()将整个表达式括起来是为了便于下面使用find和group方法获取各个匹配的结果
String regex="([a-zA-Z]+[0-9]+)";   
Pattern pattern=Pattern.compile(regex);
String input="age45 salary500000 50000 title";
Matcher matcher=pattern.matcher(input);
StringBuffer sb=new StringBuffer();
while(matcher.find())
{
  String replacement=matcher.group(1).toUpperCase();
  matcher.appendReplacement(sb, replacement);
}
matcher.appendTail(sb);
System.out.println("替换完的字串为"+sb.toString());

ps:运行结果:替换完的字串为AGE45 SALARY500000 50000 title

回到目录|·(工)·)

posted @ 2017-11-30 15:34  林学徒  阅读(...)  评论(...编辑  收藏