JAVA正则表达式

Java 正则表达式
正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别
一个字符串其实就是一个简单的正则表达式,例如 Hello World 正则表达式匹配 "Hello World" 字符串


在regex包中,包括了两个类,Pattern(模式类)和Matcher(匹配器类)。

Pattern类是用来表达和陈述所要搜索模式的对象,Matcher类是真正影响搜索的对象。

API文档中java.util.regex.Pattern那一页列出了正则表达式
Pattern和Matcher
一般来说,比起功能有限的String,我们更愿意构造功能强大的正则表达式对象。只需导入
java.util.regex包,然后用static Pattern.compile()方法来编译你的正则表达式即可。它
会根据你的String类型的正则表达式生成一个Pattern对象。接下来,把你想要检索的字符串
传入Pattern对象的matcher()方法。matcher()方法会生成一个Matcher对象,它有很多功能
可用。



组是用括号划分的正则表达式,可以根据组的编号来引用某个组。组号为0表示整个表达式,
组号1表示被第一对括号括起的组,依此类推。
Matcher对象提供了一系列方法,用以获取与组相关的信息:public int groupCount()
返回该匹配器的模式中的分组数目,第0组不包括在内。public String group()返回前
一次匹配操作的第0组。
public String group(int i)返回前一次匹配操作期间指定的组号,如果匹配成功,但是
指定的组没有匹配输入字符串的任何部分,则将会返回null。
public int start(int group)返回在前一次匹配操作中寻找到的组的其实索引。
public int end(int group)返回在前一次匹配操作中寻找到的组的最后一个字符索引加
一的值。
A(B(C))D中有三个组:
组0是ABCD,组1是BC,组2是C。
find()可以在输入的任意位置定位正则表达式,而lookingAt和matches()只有在正则表达式
与输入的最开始处就开始匹配时才会成功。matches()只有在整个输入都匹配正则表达式时才会

成功,而lookingAt()只要输入的第一部分匹配就会成功。

public class ReFlags {
	public static void main(String[] args) {
		Pattern p = Pattern.compile("^java",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
		Matcher m = p.matcher("javas has regex\nJava has regex\n" + 
		"JAVA has pretty good regular expressons\n" + 
		"Regular expressions are in Java\njavaa");
		while(m.find()){
			System.out.println(m.group());
		}
	}
}

java
Java
JAVA
java

^java  代表以java开头的字符串  java和javaa 都会匹配但m.group()返回的只会是java

split()  Pattern的方法

public class SplitDemo {
	public static void main(String[] args) {
		String input = "This!!unusual use!!of exclamation!!points";
		System.out.println(Arrays.toString(Pattern.compile("!!").split(input)));
		System.out.println(Arrays.toString(Pattern.compile("!!").split(input, 3)));//后面的参数3是限制分割的字符串个数
	}
}
=======结果如下
[This, unusual use, of exclamation, points]
[This, unusual use, of exclamation!!points]
public class TheReplacements {
	public static void main(String[] args) {
		String s = "/*! Here's a block of text to use as input to the regular " + 
				"expression matcher. Note that we'll first extract the block of" + 
				" text by looking for the special delimiters, then process the " + 
				"extracted block. !*/";
		Matcher mInput = Pattern.compile("/\\*!(.*)!\\*/",Pattern.DOTALL).matcher(s);//   regex正则表达式:  /*!(.*)!*/
		if(mInput.find()){
			s = mInput.group(1);//取出匹配的第1组  也就是正则表达式括号中的内容
		}
		s = s.replaceAll(" {2,}", " ");//将多个连续空格替换成单个空格
		s = s.replaceAll("(?m)^ +", "");//将所有以空格开头去掉
		System.out.println(s);
		s = s.replaceFirst("[aeiou]", "(VOWEL1)");
		StringBuffer sbuf = new StringBuffer();
		Pattern p = Pattern.compile("[aeiou]");
		Matcher m = p.matcher(s);
		while(m.find())
			m.appendReplacement(sbuf, m.group().toUpperCase());//将字符串中出现的aeiou全部替换成对应字符的大写
		m.appendTail(sbuf);//将此行注释掉就可以看出区别
		System.out.println(sbuf);
	
	}
}

输出结果如下==============
Here's a block of text to use as input to the regular expression matcher. Note that we'll first extract the block of text by looking for the special delimiters, then process the extracted block. 
H(VOWEL1)rE's A blOck Of tExt tO UsE As InpUt tO thE rEgUlAr ExprEssIOn mAtchEr. NOtE thAt wE'll fIrst ExtrAct thE blOck Of tExt by lOOkIng fOr thE spEcIAl dElImItErs, thEn prOcEss thE ExtrActEd blOck.




展开阅读全文

没有更多推荐了,返回首页