黑马程序员-----Java基础-----正则表达式

来源:互联网 发布:js隐藏div 编辑:程序博客网 时间:2024/06/05 16:41

-----<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

 正则表达式


 正则表达式:符合一定规则的表达式
 
 作用;专门操作字符串
 好处: 可以简化对字符串的复杂操作
 特点; 用于一些特定的符号来表示一些代码操作,这样就简化书写。
 所以学习正则表达式及时学习一些特殊符号应用。
 
 弊端: 符号定义越多,正则越长,不易阅读
 

 具体功能:
 1,匹配   String  matches 方法
 
 对qq号进行校验
 要求:5-13  0不能开头   只能是数字
 
 [abc]取一个字母只能是abc中一个
 [^abc]除了abc都可以
 [abc][a-z]第一个字母只能是abc中一个,第二个是小写字母
 [a-zA-Z]字母
 [0-9]数字或者\\d,不是数字\\D
 \\w 单词符[a-zA-Z_0-9]
 \\W 非单词
 
 ? 一次或一次也没有
 * 0次或多次  [a-zA-Z]\\d* -- b124
 +  一次或多次
 {n} 恰好n次
 {n,} 最少n此
 {n,m} 最少n次,不超过m次[a-zA-Z]\\d{3,8}
 
 
 2,切割  String   split
  一次或多次切割,多空格切割
  String str ="zhangsan    lisi  wangwu";
String reg =" +";

  表示任意符号   .  点\\.
 String str ="zhangsan.lisi.wangwu";
 String reg="\\.";
 
 切反斜扛
 str="c:\\abc\\a.txt";
 String reg="\\\\";
 
 切叠词
 str="sdfddkllldfsdff1";
 String reg="(.)\\1";
 String reg="(.)\\1+";多个叠在一起也可以切
 (()(())) 四个组 第一个从最左边开始,查左括号几个就是几组,
 
 
 3,替换
String str ="dsfl8394289035dksjf29239048290";//将数字变成#号
String reg ="\\d{5,}";//连续5个以上数字替换成#
String s = str.replaceAll(reg, "#"); 
 
String str ="dsfl888839428dsfhwjjelllfssoe9035dksjf29239048290";//将叠词变成*号
String reg ="(.)\\1+";
String s = str.replaceAll(reg, "*");
 
String str ="dsfl888839428dsfhwjjelllfssoe9035dksjf29239048290";//将重复字母变成单字母
String reg ="(.)\\1+";

4,获取
 
import java.util.Iterator;

public class RegexDemo {

public static void main(String[] args) {
replace();

//3,替换
public static void replace()
{
/*String str ="dsfl8394289035dksjf29239048290";//将数字变成#号
String reg ="\\d{5,}";//连续5个以上数字替换成#
String s = str.replaceAll(reg, "#");*/

/*String str ="dsfl888839428dsfhwjjelllfssoe9035dksjf29239048290";//将叠词变成*号
String reg ="(.)\\1+";*/

String str ="dsfl888839428dsfhwjjelllfssoe9035dksjf29239048290";//将重复字母变成单字母
String reg ="(.)\\1+";

String s = str.replaceAll(reg, "$1");
System.out.println(s);
}

//2,切割
public static void split()
{
String str ="zhangsan.lisi.wangwu";
str="c:\\abc\\a.txt";
str="sdfddkllldfsdff1";

//String reg =" +";
//String reg="\\.";
//String reg="\\\\";
String reg="(.)\\1";


String [] arr =str.split(reg);
for(String s :arr)
{
System.out.println(s);
}

}

//匹配手机号13xxx  15xxx  18xxx
public static void check2()
{
String tel ="13548946848";
String regex ="1[358]\\d{9}";
System.out.println(tel.matches(regex));
}
public static void check1()
{
String qq ="52416a5";
String regex ="[1-9][0-9]{4,14}";
boolean flag =qq.matches(regex);
if(flag)
{
System.out.println(qq);
}
else
{
System.out.println("非法");
}
}
public static void check()
{
String qq ="45255a";
int  len =qq.length();
if(len >=5 && len <=13)
{
if(!qq.startsWith("0"))
{
//这种方法,使用了string类中的方法,进行组合完成需求,代码过于复杂
try{
long l =Long.parseLong(qq);
System.out.println("qq:"+l);
}
catch(Exception e)
{
System.out.println("出现非法字符");
}


/*char[] arr = qq.toCharArray();
boolean flag = true;
for (int i = 0; i < arr.length; i++) 
{
if(!(arr[i]>='0'&& arr[i]<= '9'))
{
flag = false;
break;
}
}
if(flag)
{
System.out.println(qq);
}
else
{
System.out.println("出现非法字符");
}*/

}
else
{
System.out.println("不能以0开头");
}

}
else
{
System.out.println("长度有误");
}
}

}
--
package Regex;

 正则表达式的第四个功能
 获取,将字符串中的符合规则的子串取出
 先find 在group
 
 步骤
 1,将正则表达式封装成对象
 2,让正则对象和要操作的字符串相关联
 3,关联后,获取正则匹配引擎
 4,通过引擎对符合规则的子串进行操作,比如取出。
 
import java.util.regex.*;
public class RefexDemo2 {

public static void getDemo()
{
String str ="ming tian jiu yao hui jia le";
String reg ="\\b[a-z]{3}\\b";//加上单词边界
//将规则封装成对象
Pattern p =Pattern.compile(reg);

//让正则对象和要作用的字符串想关联
Matcher m = p.matcher(str);
//起始String类中的matches方法,就是pattern和matcher对象;来完成的只不过被string方法封装。

// boolean b =m.find();//将规则作用在字符串上,并进行符合规则查找
// System.out.println(b);
// System.out.println(m.group());//group 用于获取匹配后的结果

while(m.find())
{
System.out.println(m.group());
//得到的字符串角标
System.out.println(m.start()+"--"+m.end());
}

}
public static void main(String[] args) {
getDemo();
}

}
--
package Regex;

import java.util.TreeSet;

 到底用四中方法中的哪一个,或者几个
 思路分析
 1,如果只想知道该字符串是对错,使用匹配
 
 2,想要将已有的字符串变成另一个字符串,替换
 
 3,想要安装自己的方式将字符串变成多个字符串,切割,获取以外的子串
 
 4,想要拿到符合需求的字符串,获取,获取符合规则子串
 
public class RegexDemo3 {

public static void main(String[] args) {

String str="我我...我我...我要...要要...学学学...编程..遍.程";
/*
将已有字符串变成另一个字符串,使用替换
1,可以先将.去掉。
2,在将多个重复内容变成单个内容。
*/
str= str.replaceAll("\\.+", "");
System.out.println(str);
str =str.replaceAll("(.)\\1+", "$1");
System.out.println(str);
ipSort();
checkMail();
}

192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30
将ip地址进行地址段顺序排序。
   
public static void ipSort()
{
String ip ="192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30";
ip =ip.replaceAll("(\\d+)", "00$1");
System.out.println(ip);

ip =ip.replaceAll("0*(\\d{3})", "$1");
System.out.println(ip);
String[] arr =ip.split(" ");

TreeSet<String> ts = new TreeSet<String>();
for(String s :arr)
{
ts.add(s);
}
for(String s: ts)
{
System.out.println(s.replaceAll("0*(\\d+)", "$1"));
}

}

对邮件地址进行校验
匹配
 
public static void checkMail()
{
String mail ="abc123@sina.com.cn";
String reg ="[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";//较为精确匹配
reg="\\w+@\\w+(\\.\\w+)+";//相对不太精确的匹配
System.out.println(mail.matches(reg));

}
}
--
//网页爬虫
//获取指定文档中的邮件地址
//使用获取功能,pattern,matcher
public class RegexDemo4 {

public static void main(String[] args)throws Exception
{
BufferedReader bfr = new BufferedReader(new FileReader("mail.txt"));

String line =null;
String mailreg ="\\w+@\\w+(\\.\\w+)+";
Pattern p =Pattern.compile(mailreg);

while((line = bfr.readLine())!=null)
{
Matcher m =p.matcher(line);
while(m.find())
{
System.out.println(m.group());
}
}
}
//网页版爬虫
public static void getmail1()throws Exception
{
URL url =new URL("网址");
URLConnection coon =url.openConnection();
BufferedReader bfr =new BufferedReader(new InputStreamReader(coon.getInputStream()));
String line =null;

String mailreg ="\\w+@\\w+(\\.\\w+)+";
Pattern p =Pattern.compile(mailreg);

while((line = bfr.readLine())!=null)
{
Matcher m =p.matcher(line);
while(m.find())
{
System.out.println(m.group());
}
}
}
}

-----<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

0 0