正则表达式

正则表达式:

用于操作字符串,通过一些特定的符号来体现。

数量词:

X??X,一次或一次也没有
X*?X,零次或多次
X+?X,一次或多次
X{n}?X,恰好 n
X{n,}?X,至少 n
X{n,m}?X,至少 n 次,但是不超过 m
字符类
[abc]abc(简单类)
[^abc]任何字符,除了 abc(否定)
[a-zA-Z]azAZ,两头的字母包括在内(范围)
[a-d[m-p]]admp[a-dm-p](并集)
[a-z&&[def]]def(交集)
[a-z&&[^bc]]az,除了 bc[ad-z](减去)
[a-z&&[^m-p]]az,而非 mp[a-lq-z](减去)
预定义字符类
.任何字符(与行结束符可能匹配也可能不匹配)
\d数字:[0-9]
\D非数字: [^0-9]
\s空白字符:[ \t\n\x0B\f\r]
\S非空白字符:[^\s]
\w单词字符:[a-zA-Z_0-9]
\W非单词字符:[^\w]
Possessive 数量词
X?+X,一次或一次也没有
X*+X,零次或多次
X++X,一次或多次
X{n}+X,恰好 n
X{n,}+X,至少 n
X{n,m}+X,至少 n 次,但是不超过 m

public class RegexDemo {

public static void main(String[] args){
/*正则表达式
* 1 匹配。
*  String 类中的matches方法
* 2 切割
*  String 类中的split方法
* 3 替换
*   String类中的reolaceAll()方法
* 4 获取
* 将正则表达式进行对象的封装。
*  Pattern p = Pattern.compile("a*b");
*  通过正则对象的matcher方法与字符串相关联,获取要对字符串操作的匹配对象Matcher
  Matcher m = p.matcher("aaaaab");
  通过Mather匹配器对象的方法对字符串进行操作
  boolean b = m.matches();

* */
test_2();
}


public static void funtionDemo_4() {
String str = "da jia hao,ming tian bu fang jia";
String regex = "\\b[a-z]{3}\\b";
//1 将正则封装成对象
Pattern p = Pattern.compile(regex);
//2 通过正则对象获取匹配器对象
Matcher m =p.matcher(str);
//3 使用Matcher对象的方法对字符串进行操作。
//既然要获取三个字母组成的单词
//查找。find
while(m.find()){
System.out.println(m.group());//获取匹配的子序列
}

}


public static void funtionDemo_3() {
String str = "zhangsanttttxiaoqiangmmmmmmzhaoliu";
str = str.replaceAll("(.)\\1+", "#");
str = str.replaceAll("(.)\\1+", "$1");
String tel = "15800001111";//158****1111
tel = tel.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
System.out.println(tel);

}


public static void funtionDemo_2() {
String str = "zhangsan            xiaoqiang zhaoliu";
String str1 = "zhangsan.xiaoqiang.zhouliu";
String str2 = "zhangsanttttxiaoqiangmmmmmmzhaoliu";
String[] names2 = str2.split("(.)\\1+)");
//组:((A)(B(c))) 看左括号此例一共四个组
String[] names = str.split(" +");
String[] names1 = str1.split("\\.");
for(String name:names){
System.out.println(name);
}

}


public static void funtionDemo_1() {
//匹配手机号是否正确
String tel = "158000011110";
String regex = "1[358][0-9]{9}";//或者"1[358]\\d{9}"
boolean b = tel.matches(regex);
System.out.println(b);

}
/*1 治疗口吃:我我...我我..我我我..我要要..要要要...要学学..学学..学 
*2 对ip地址排序
*3 对邮件地址效验
* */
public static void test_1(){
//1 将字符串中.去掉。用替换
String str = "我我...我我..我我我..我要要..要要要...要学学..学学..学";
str = str.replaceAll("\\.+", "");
System.out.println(str);
//2 替换叠词
str = str.replaceAll("(.)\\1+", "$1");
System.out.println(str);
}
public static void test_2(){
//192.168.10.34 127.0.0.1 3.3.3.3 105.70.11.55


String ip_str = "192.168.10.34 127.0.0.1 3.3.3.3 105.70.11.55";
//1 为了让ip可以按照字符串顺序比较,只要让ip的每一段的位数相同。
//所以,补零,按照每一位所需补充0.每一段都加两个零。
ip_str = ip_str.replaceAll("(\\d+)","00$1");
System.out.println(ip_str);
//然后每一段保留数字3位
ip_str = ip_str.replaceAll("0*(\\d{3})", "$1");
// 将ip地址切出
String[] ips = ip_str.split(" +");
TreeSet<String> ts = new TreeSet<String>();
for(String ip : ips){
ts.add(ip);
}
for(String ip : ts){
System.out.println(ip.replaceAll("0*(\\d+)", "$1"));
}
}
public static void test_3(){
String mail = "abc1@sina.com.cn";
String regex = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-z]{1,3})+";
boolean b = mail.matches(regex);
System.out.println(mail+":"+b);
}


/*网页爬虫:其实是一个程序用于在互联网中获取符合指定规则的数据
* 爬取邮箱地址。
* */
public static List<String> PaChong() throws IOException{
//1 读取源文件
BufferedReader bufr = new BufferedReader(new FileReader("c:\\mail.html"));
//2 对读取的数据进行规则的匹配。从中获取符合规则的数据
String regex = "\\w+@\\w+(\\.\\w+)+";
List<String> list = new ArrayList<String>();
Pattern p = Pattern.compile(regex);
String line = null;
while((line = bufr.readLine())!=null){
Matcher m = p.matcher(line);
while(m.find()){
//3 将符合规则的数据存储到集合中
list.add(m.group());
} }

return list;
}


//爬取网页
public static List<String> PaChong_1() throws IOException{
//1 读取源文件
URL url = new URL("http://192.168.1.100:8080/myweb/mail.html");
BufferedReader bufIn = new BufferedReader(new InputStreamReader(url.openStream()));
//2 对读取的数据进行规则的匹配。从中获取符合规则的数据
String regex = "\\w+@\\w+(\\.\\w+)+";
List<String> list = new ArrayList<String>();
Pattern p = Pattern.compile(regex);
String line = null;
while((line = bufIn.readLine())!=null){
Matcher m = p.matcher(line);
while(m.find()){
//3 将符合规则的数据存储到集合中
list.add(m.group());
}
}

return list;
}


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值