java正则表达式是通过java.util.regex包中的Pattern和Matcher类实现的。 阅读本文时,如果要打开java API文档并讨论哪些方法,请参阅java API方法的说明,这会很有帮助。
Pattern类用于创建正则表达式。 也就是说,它用于创建匹配模式。 虽然构建方法是私有的,不能直接创建,但是可以使用Pattern.complie(String regex )的简单工厂方法创建正则表达式。
Java代码示例:
patternp=pattern.compile((w );
p.pattern (; //上一步
compile(String regex将正则表达式编译为Pattern。 该方法是静态方法
pattern ()返回正则表达式的字符串格式,实际上是pattern.complile(stringregex )的regex参数。
1.pattern.split (charsequenceinput ) )。
Pattern包含用于分隔字符串并返回字符串[ ]的split(charsequenceinput )方法。 我认为string.split(stringregex )是通过pattern.split (char sequence )传递的
Java代码示例:
patternp=pattern.compile('d ' );
String[] str=p.split (我叫:456456我的电话是:0532214我的邮箱地址是:aaa@aaa.com) );
结果: str[0]='我叫:' str[1]='我的电话是:' str[2]='我的邮箱地址是:aaa@aaa.com '
2.pattern.matcher(stringregex,CharSequence input ) ) )。
pattern.matcher(stringregex,CharSequence input )适用于快速匹配字符串的静态方法,只匹配一次,然后匹配所有字符串。
Java代码示例:
Pattern.Matches('d ',' 2223 ' ); 返回true
Pattern.Matches('d ',' 2223aa ' ); 返回false。 必须匹配所有字符串才能返回true。 在这里,aa是
Pattern.Matches('d ',' 22bb23 ' ); 要返回false并返回true,必须匹配所有字符串。 这里bb与不一致
3.pattern.matcher (charsequenceinput ) )。
pattern.matcher (charsequenceinput )返回matcher对象。
Matcher类的构建方法也是私有的,不能自行创建。 只能通过pattern.matcher (charsequenceinput )方法获得类的实例。
Pattern类只能进行简单的匹配操作。 要获得更强大、更方便的正则匹配操作,需要Pattern和Matcher进行协作。 Matcher类提供正则表达式分组支持和正则表达式多次匹配支持。
Java代码示例:
patternp=pattern.compile('d ' );
matcherm=p.matcher(22bb23 );
m.pattern (; 返回//p表示该Matcher对象是哪个Pattern对象创建的
4.Matcher.matches (
Matcher类提供了三种匹配操作方法: matcher.matches (/matcher.looking at )/Matcher.find )。 这三种方法都返回布尔型,如果匹配则返回true,否则返回false
matches ()匹配整个字符串,并且仅当整个字符串匹配时返回true
Java代码示例:
patternp=pattern.compile('d ' );
matcherm=p.matcher(22bb23 );
m.matches (; 返回false。 由于bb在d中不匹配,整个字符串的匹配失败。
matcherM2=p.matcher('2223 );
m2.matches (; //由于d与整个字符串匹配,返回true
让我们看看pattern.matches(stringregex,CharSequence input )。 这是与以下代码等效的pattern.compile(regex ).matcher ) input ).matches
5.Matcher.lookingAt (
lookingAt () )与上一个字符串匹配,并且仅当匹配字符串位于开头时返回true
Java
代码示例:Pattern p=Pattern.compile("\d+");
Matcher m=p.matcher("22bb23");
m.lookingAt();//返回true,因为d+匹配到了前面的22
Matcher m2=p.matcher("aa2223");
m2.lookingAt();//返回false,因为d+不能匹配前面的aa
6.Matcher.find()
find()对字符串进行匹配,匹配到的字符串可以在任何位置.
Java代码示例:
Pattern p=Pattern.compile("\d+");
Matcher m=p.matcher("22bb23");
m.find();//返回true
Matcher m2=p.matcher("aa2223");
m2.find();//返回true
Matcher m3=p.matcher("aa2223bb");
m3.find();//返回true
Matcher m4=p.matcher("aabb");
m4.find();//返回false
7.Mathcer.start()/ Matcher.end()/ Matcher.group()
当使用matches(),lookingAt(),find()执行匹配操作后,就可以利用以下三个方法得到更详细的信息.
start():返回匹配到的子字符串在字符串中的索引位置.
end():返回匹配到的子字符串的最后一个字符在字符串中的索引位置.
group():返回匹配到的子字符串
Java代码示例:
Pattern p=Pattern.compile("\d+");
Matcher m=p.matcher("aaa2223bb");
m.find();//匹配2223
m.start();//返回3
m.end();//返回7,返回的是2223后的索引号
m.group();//返回2223
Mathcer m2=p.matcher("2223bb");
m2.lookingAt();//匹配2223
m2.start(); //返回0,由于lookingAt()只能匹配前面的字符串,所以当使用lookingAt()匹配时,start()方法总是返回0
m2.end(); //返回4
m2.group(); //返回2223
Matcher m3=p.matcher("2223"); //如果Matcher m3=p.matcher("2223bb"); 那么下面的方法出错,因为不匹配返回false
m3.matches(); //匹配整个字符串
m3.start(); //返回0
m3.end(); //返回3,原因相信大家也清楚了,因为matches()需要匹配所有字符串
m3.group(); //返回2223
start(),end(),group()均有一个重载方法它们是start(int i),end(int i),group(int i)专用于分组操作,Mathcer类还有一个groupCount()用于返回有多少组.
Pattern p=Pattern.compile("([a-z]+)(\d+)");
Matcher m=p.matcher("aaa2223bb");
m.find();//匹配aaa2223
m.groupCount(); //返回2,因为有2组
m.start(1); //返回0 返回第一组匹配到的子字符串在字符串中的索引号
m.start(2); //返回3
m.end(1); //返回3 返回第一组匹配到的子字符串的最后一个字符在字符串中的索引位置.
m.end(2); //返回7
m.group(1); //返回aaa,返回第一组匹配到的子字符串
m.group(2); //返回2223,返回第二组匹配到的子字符串
例子:
例如有一段文本(我的QQ是:3609789 我的电话是:0532214 我的邮箱是:aaa123@aaa.com),里面有很多数字,而且这些数字是分开的,我们现在要将文本中所有数字都取出来,利用java的正则操作是那么的简单.
Pattern p=Pattern.compile("\d+");
Matcher m=p.matcher("我的QQ是:3609789 我的电话是:0532214 我的邮箱是:aaa123@aaa.com");while(m.find()) {
System.out.println(m.group());
}
输出:
3609789
0532214
123
总结:
现在应该知道,每次执行匹配操作后start(),end(),group()三个方法的值都会改变,改变成匹配到的子字符串的信息,以及它们的重载方法,也会改变成相应的信息.
只有当匹配操作成功,才可以使用start(),end(),group()三个方法,否则会抛出java.lang.IllegalStateException,也就是当matches(),lookingAt(),find()其中任意一个方法返回true时,才可以使用.
Pattern与Matcher一起合作,Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持.。单独用Pattern只能使用Pattern.matcher(String regex,CharSequence input)一种最基础最简单的匹配。
Pattern.compile(regex).matcher(input).matches()