------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------
正则表达式:符合一定规则的表达式,用于操作字符串。
功能:
1.匹配:boolean matches();如果匹配整个字符串,只要有一处不符合,就匹配结束,返回false。例如:
//检测手机号码,号码格式必须要以13,15,18开头的11位数字
public static void checkTel(String tel) {
String telReg = “1[358]\\d{9}”;
//这串正则表达式的意思就是以数字1开头,3,5,8作为第二位数字。任意数字作为第三位数字并且连续出现9次
boolean b = tel.matches(reg);
System.out.println(b);
}
2.切割:String[] split() 把符合规则的字符串都排除在外。
//例如有一串字符串,中间有多个空格。按照多个空格切
public static void splitDemo(String str) {
String reg = “ +”;//空格出现了一次或者多次的时候,符合正则表达式
String[] arr = str.split(“reg”);
for(String s : arr) {
System.out.println(s);
}
3.替换:String replaceAll(regex, str) 把符合规则的字符串都替换掉
//例如:有一段字符串erkktyqqquizzzzzo。把叠词都替换成#号
String str = “erkktyqqquizzzzzo”;
String reg = “(.)\\1+”; // .代表任意字符,括号括起来的代表为组。\1代表组的编号
str.replaceAll(reg, “#$1”);// $1代表序号为1的组
4.将字符串中的符合规则的子串取出
步骤:
(1) 将正则表达式封装成对象
(2) 让正则对象和要操作的字符串相关联
(3) 关联后,获取正则匹配引擎
(4) 通过引擎对符合规则的子串进行操作,比如取出
代码示例:
//将一段字符串中,长度为3的单词取出
String str = “ming tian jiu yao fang jia le , da jia”;
String reg = “\\b[a-z]{3}\\b”; // \b代表单词边界符
//将规则封装成对象
Pattern p = Pattern.compile(reg);
//让正则表达式和要作用的字符串关联,获取匹配器对象
Matcher m = p.matcher(str);
while(m.find()) { //find方法会去寻找符合规则的字符串
System.out.println(m.group()); }//group方法为取出
· 思考:正则表达式的4种功能,什么时候该用哪一个呢?
思路方式:
1. 如果只想知道该字符串是否对错,使用匹配
2. 想要将已有的字符串变成另一个字符串,替换
3. 想要按照自己定义的方式将一个字符串变成多个字符串。切割,获取规则以外的子串
4. 想要拿到符合需求的字符串子串,获取,获取符合规则的子串
在正则表达式中,有很多表现形式:
常用的有:
字符类:
[abc] : 代表单个字符,这个字符可以是a/b/c中的一个
[^abc] : 代表单个字符,这个字符可以是除了abc的任意一个
[a-zA-Z] :代表单个字符,这个字符是a-z和A-Z中的一个
[a-d[m-p]] :并集的方法
[a-z&&[def]] :交集的方法
预定义字符类:
. : 任何字符
\d : 数字[0-9]
\D : 非数字
\s : 空白字符
\S : 非空白字符
\w : 单词字符[a-zA-Z_0-9]
\W : 非单词字符
边界匹配器:
^ 行的开头
$ 行的结尾
\b 单词的边界
\B 非单词的边界
数量词
X? 一次或者一次没有
X* 零次或者多次
X+ 一次或者多次
X{n} 恰好n次
X{n,} 最少n次
X{n,m} 至少n次,不超过m次
组
被括号括起来是为组,在组的后面有个\n,n就是组的序号。通过$n可以调用组的内容
正则表达式的代码示例:
1. 对邮件地址进行校验
public static void checkMail()
{
String mail = "abc12@sina.com";
mail = "1@1.1";
String reg = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";//较为精确的匹配。
reg = "\\w+@\\w+(\\.\\w+)+";//相对不太精确的匹配。
//mail.indexOf("@")!=-1
System.out.println(mail.matches(reg));
}
2. 将下列字符串转成:我要学编程
public static void test()
{
String str = "我我...我我...我要..要要...要要...学学学....学学...编编编...编程..程.程程...程...程";
/*
将已有字符串变成另一个字符串。使用 替换功能。
1,可以先将 . 去掉。
2,再将多个重复的内容变成单个内容。
*/
str = str.replaceAll("\\.+","");
str = str.replaceAll("(.)\\1+","$1");
System.out.println(str);
}
网络爬虫程序:对网页的字符串进行校验,获取有用的信息。比如:别人的邮箱
/*
网页爬虫(蜘蛛)
*/
import java.io.*;
import java.util.regex.*;
import java.net.*;
import java.util.*;
class RegexTest2
{
public static void main(String[] args) throws Exception
{
getMails();
}
public static void getMails()throws Exception
{
URL url = new URL("http://192.168.1.254:8080/myweb/mail.html");
URLConnection conn = url.openConnection();
BufferedReader bufIn = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = null;
String mailreg = "\\w+@\\w+(\\.\\w+)+";
Pattern p = Pattern.compile(mailreg);
while((line=bufIn.readLine())!=null)
{
Matcher m = p.matcher(line);
while(m.find())
{
System.out.println(m.group());
}
}
}
}