正则表达式描述
正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。
主要是用与操作字符串的操作,在java中String类中使用String[] split(String regex) String replaceAll(Stringregex, String replacement) boolean matches(Stringregex)
方法使用正则表达式来操作字符串。
使用正在表达式的优点:
1.操作有一定规则的字符串使用正则表达式比较简便。
正在表达式的使用规则:
1.[]代表一个字符,[abc]代表在匹配的字符中是否是一个字符而且该字符必须是a或着是b或者是c。否则匹配不通过。[^abc]表示在匹配字符串时该字符是否是一个字符,该字符不可以是a或b或c,否则匹配不通过。
2. [a-zA-Z]代表在匹配字符穿的时候该字符串是一个字符,但是必须是字母并且不区分大小写。
3. [a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集);在匹配字符的时候该字符串必须为一个字符并且该字符必须在a-d之间或者在m-p之间。
4.[a-z&&[def]] d、e 或 f(交集);在匹配字符串的时候字串穿必须在a-z之间而且不能有’d’、’e’、’f’三个字符。
5.组的概念:(.)\\1;例如字符串“hjvvjklh”在匹配的过程中使用(.)\\1该正则匹配能够匹配到vv字符。也就是匹配“叠词”
6.{4,9};匹配需要匹配的字符串的长度为5-9位。
7.[1]{8};匹配该字符串必须为8个1
8. [1]{8,11};匹配该字符串必须为8-11个1
9. [1]{8,};匹配该字符串必须为8个以上的1
10. x|y; 匹配 x 或 y。例如,'z|food' 匹配“z”或“food”。'(z|f)ood' 匹配“zood”或“food”。这种情况下必须保证需要测试的字符串必须和正则表达式的表示字符串个数相同。
预定义字符类
1、. 任何字符(与行结束符可能匹配也可能不匹配)
2、\d 数字:[0-9]
3、\D 非数字: [^0-9]
4、\s 空白字符:[ \t\n\x0B\f\r]
5、\S 非空白字符:[^\s]
6、\w 单词字符:[a-zA-Z_0-9]
7、\W 非单词字符:[^\w]
练习一
判断一个字符串是不是QQ号
QQ号必须为5-15位数字,第一位必须不能为0
1.使用正则表达式:[1-9][0-9]{5,15}
2.通过String类中的matches()方法。匹配字符串是否满足以上条件。
练习二
邮箱的验证:abc_123@163.com
[0-9a-zA-Z_]+[@][0-9a-zA-Z]+(\\.[a-zA-Z]+)+
[0-9a-zA-Z_]+:判断@符号前面的字符是不是为“字母数字下划线”==\w
[0-9a-zA-Z]+;判断@后面“.”前面的数组是不是“字母数字”可以出现多次
[a-zA-Z]+;判断“.”后面是否为字母。可以是大写字母
(\\.[a-zA-Z]+)+;把判断“.com”的正在符号设定成一个组然后这个组可以出现多次。
在java编程语言中可以用正则表达式操作字符串的几种方式:
1.判断
String 类中的matcher(正则表达式);判断字符串是否满足正则表达式的规则。
2.替换
replaceAll(正则表达式,想要替换成的字符串)
使用想要替换成的字符串,替换字符串中满足正则表达式的所有字串
String replaceFirst(正则表达式,想要替换成的字符串)
使用想要替换成的字符串替换此字符串匹配给定的正则表达式的第一个子字符串。
3.切割
String[]split(String regex)
根据给定正则表达式的匹配拆分此字符串。
String[] split(String regex, int limit)
根据匹配给定的正则表达式来拆分此字符串。
切割是:使用正在表达式分割字符串,切割出来的子串不包括正则表达式的规则。
4.获取
在获取满足正在表达式的规则的子串的时候,使用java.util.regex
包中的 Pattern类来获取字符串获取引擎来获取字符串。
Pattern类没有构造方法,所以该类在创建实例的时候需要使用该类的静态方法compile(Stringregex) 根据一个正则表达式关联创建一个实例对象。
创建实例完成以后使用该实例的matcher()方法返回一个字符串获取引擎对象Matcher。
使用该引擎的find()对象查找字符中是否含有满足正则表达式的子串。
使用该引擎的group()方法获取满足正则表达式的子串。
练习一:
获取文本文档中的邮箱地址。
文本文件内容如下图所示:
代码示例:
public staticvoid getMall() throws Exception
{
BufferedReader bfr=new BufferedReader(newFileReader("maill.txt"));
String line="";
Stringarge="\\w+@\\w+(\\.[a-zA-Z]+)+";
Pattern p=Pattern.compile(arge);
while((line=bfr.readLine())!=null){
//System.out.println(line);
Matcher matcher=p.matcher(line);
while(matcher.find()){
System.out.println(matcher.group());
}
}
}
代码运行效果如下图所示:
练习二
获取网页上面的邮箱地址:
获取http://www.meizu.com/contact.html网站上的邮箱地址
代码如下所示:
public staticvoid getMallUrl() throws Exception
{
URL url=newURL("http://www.meizu.com/contact.html");
URLConnectionconnection=url.openConnection();
BufferedReader bfr=new BufferedReader(newInputStreamReader(connection.getInputStream(),"UTF-8"));
String line="";
String arge="\\w+@\\w+(\\.[a-zA-Z]+)+";
Pattern p=Pattern.compile(arge);
while((line=bfr.readLine())!=null){
Matcher matcher=p.matcher(line);
while(matcher.find()){
System.out.println(matcher.group());
}
}
}