您的位置:首页 > 职场人生

黑马程序员----正则表达式

2015-08-15 11:25 525 查看
——- android培训java培训、期待与您交流! ———-

正则表达式

符合一定规则的表达式,用于专门操作字符串。

对字符窜操作既简单有有效的方法就是正则表达式。

弊端:符号定义越多,正则表达式越长,阅读性越差;

用一些特定的符号来表示一些代码的操作,这样就简化书写。所以学习正则表达式就是在学习一些特殊符号的使用。

正则表达式具体操作功能:

1.匹配:String matches();

        用规则匹配整个字符串,只要有一个不符合规则就结束,返回false。

        在正则表达式当中,反斜杠都是成对出现的,\\d:第一个反斜杠把第二个反斜杠转义成普通的反斜杠,\d是一个组合,代表的是数字[0-9];

2.切割:String split();

        .代表任意字符,如果一定要用.切割,就转义一下:String regex="\\.";

        按照叠词切割;叠词就是后一个和前一个是一致的。当要对一个规则的结果进行重用的时候,就封装成组,用(),而且从1开始自动编号,这个组中的结果就可以被再次使用,用\n捕获组的概念,其中的n为组的编号。     

        (()(())(())):有几组就看有几个左括号,并且第一个左括号为第一组,依次类推。

3.替换:String replaceAll();

        $1:指前面那个符号里的第一个组。前提是一定要有组。如果不写,默认整个字符串就是一个组,为第0组,替换不了。

4.获取:

        按照规则取字符串子串;

        操作步骤:

        1.将正则表达书封装成对象;

        2.让正则对象和要操作的字符串相关联;

        3.关联后,获取正则匹配引擎;

        4.通过引擎对符合规则的子串进行操作,比如取出。

单词边界:\b;

非单词边界:\B;
同一个匹配器用的是同一个索引位。

public class Regex_0
{
public static void sop()
{
System.out.println();
}
public static void main(String[] args)
{
//匹配:
//checkQQ();
//checkqq();
//demo();
//checkTel();

//切割:
splitDemo("zjamgdan,lisi, wangwu",",");//按照逗号切割;
sop();
splitDemo("zjamgdan    lisi      wangwu"," +");//按照一个或者多个空格切割;
sop();
splitDemo("zjamgdan.lisi.wangwu","\\.");//.代表任意字符,如果一定要用.切割,就转义一下:String regex="\\.";
sop();
splitDemo("c:\\abc\\a.tet","\\\\");//按照两个反斜杠切割;
sop();
splitDemo("abccdefgghijkllmnoopqqqqistuvwwxyz","(.)\\1+");//按照叠词切割;叠词就是后一个和前一个是一致的。
//当要对一个规则的结果进行重用的时候,就封装成组,用(),而且有自动编号,从1开始,这个组中的结果就可以被再次使用,用\n表示捕获组的概念,其中的n为组的编号。
//(()(())(())):有几组就看有几个左括号,并且第一个左括号为第一组,依次类推。
sop();

//替换:
replaceAllDemo("wer123tryufh45631232hfbvngj78","\\d{5,}","#");//将字符串中的数字替换成#;
replaceAllDemo("wer123tryyufh45563123332hfbvnngj78","(.)\\1+","#");//将叠词替换成#;
replaceAllDemo("wer123tryyufh45563123332hfbvnngj78","(.)\\1+","$1");//将重叠的字母替换成单个字母;$是一个特殊符号,获取组;
sop();

//获取:
get();
}
//------------------------------------------------------------------------
//正则表达式的切割功能演示:替换
public static void replaceAllDemo(String str,String regex,String newstr)
{
str=str.replaceAll(regex, newstr);
System.out.println(str);
}
//------------------------------------------------------------------------
//正则表达式的切割功能演示:	获取
public static void get()
{
String str="ming tian jiu yao fang jia le !da jia hao kai xin.";
//获取由3个字母组成的的单词:
String regex="\\b[a-z]{3}\\b";//单词边界:\b;
//str="123456789";
//String regex="[1-9]\\d{4,14}";

//将规则封装成对象:
Pattern p=Pattern.compile(regex);

//让正则对象与要作用的字符串相关联:
Matcher m=p.matcher(str);

//System.out.println(m.matches());
//其实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 splitDemo(String str,String regex)
{
String[] arr=str.split(regex);
for(String s:arr)//高级for循环;
{
System.out.println(s);
}
}
//------------------------------------------------------------------------
//正则表达式的匹配功能演示:

//验证电话号码:13*,15*,18*。
public static void checkTel()
{
String tel="17658941423";
String regex="1[358]\\d{9}";
System.out.println(tel.matches(regex));

}
//---------------------------------------
public static void demo()
{
String str="a";

String regex="[acd]";//字符串中的第一个字符只能是a或者c或者d,而且这个字符串只能有一个字符;

boolean b=str.matches(regex);
System.out.println(b);
}
//----------------------------------------
public static void checkqq()
{
//看字符串匹配,如果匹配就返回true,不匹配就返回false;
String qq="023456";
String regex="[1-9][0-9]{4,14}";

boolean flag=qq.matches(regex);
if(flag)
{
System.out.println(" QQ number:"+qq+" is ture");
}
else
{
System.out.println(" QQ number is false");
}
}
//--------------------------------------------
//需求:对QQ号码进行校验:5-15位,0不能开头,只能是数字。
public static void checkQQ()
{
String qq="234aa56789";

int len=qq.length();

if(len>5&&len<15)
{
if(!qq.startsWith("0"))//Integer.parseInt("12a");NumberFormatException
{
//让Java帮我们校验:
try
{
long l=Long.parseLong(qq);
System.out.println("QQ号码:"+qq);
}
catch(NumberFormatException e)
{
System.out.println("出现非法字符");
}

/*
//判断字符串中的每一位是不是数字:把字符窜变成数组;
char[] arr=qq.toCharArray();
boolean flag=true;//定义标记;
for(int x=0;x<arr.length;x++)
{
if(!(arr[x]>='0'&&arr[x]<='9'))
{
flag=false;
break;
}
}
if(flag)
{
System.out.println("QQ号码:"+qq);
}
else
{
System.out.println("QQ号码有非法字符");
}*/
}
else
{
System.out.println("QQ号码不能以数字0开头");
}
}
else
{
System.out.println("长度错误");
}
//这种方式使用了String类中的方法,进行组合完成了需求,但是代码过于复杂。
}
}//class


需求:
1.将下列字符串转成:“我要学编程”

String str="我我...我我...我要..要要...学学学....学学...编编编..编程...程程...程.程.程";

到底用四种功能中的哪一个或者哪几个呢?

思路:

        如果只想知道该字符串是对是错可以使用匹配;

        如果想要将已有的字符串变成另一个字符串可以使用替换;

        如果想要按照自定义的方式将字符串变成多个字符串可以使用切割(获取规则以外的子串)

        如果想要拿到符合需求的字符串子串可以使用获取(获取符合规则的子串)

2.将IP地址进行地址段顺序的排序:

192.168.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30

还按照字符串自然顺序,只要让它们每一段都是3位即可。

步骤:

        1.按照每一段需要的最多的0进行补齐,那么每一段就会至少保证有3位。

        2.将每一段只保留3位,这样,所有的IP地址都是每一段3位;

    

3.对邮件地址进行校验:

checkMail();
public class RegexPractice_0
{
public static void main(String[] args)
{
test_0();
System.out.println();

test_1();
System.out.println();

checkMail();
}
public static void test_0()
{
String str="我我...我我...我要..要要...学学学....学学...编编编..编程...程程...程.程.程";
//替换:将已有字符串变成另一个字符串
//1.先将.去掉;2.再将多个重复的内容变成单个内容。
str=str.replaceAll("\\.", "");//将.替换成空的字符串;
System.out.println(str);

str=str.replaceAll("(.)\\1+", "$1");//去除叠词;
System.out.println(str);
}
public static void test_1()
{
String ip="192.168.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);

//只保留3位;
ip=ip.replaceAll("0*(\\d{3})","$1");
System.out.println(ip);
System.out.println();
//切割:
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"));//去掉开头的0;
}
}
public static void checkMail()
{
String mail="123466shd@sina.com.cn.cn.cn.cn";

String regex="[a-zA-Z0-9_]{6,12}@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";//封装组,较为精确的匹配
regex="\\w+@\\w+(\\.\\w+)+";//相对不太精确的匹配;

//mail.indexOf("@")!=-1;
System.out.println(mail.matches(regex));
}
}//class

网页爬虫:蜘蛛

public class WebCrawler
{
public static void main(String[] args) throws IOException
{
getMails();
}
public static void getMails() throws IOException
{
//获取指定文档中的邮件地址,是用获取功能。Pattern Matcher
BufferedReader bufr=new BufferedReader(new FileReader("mail.txt"));//系统找不到文件;

String line=null;

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

while((line=bufr.readLine())!=null)
{
Matcher m=p.matcher(line);
while(m.find())
{
System.out.println(m.group());
}
}
}
public static void getMails_Web() 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 mailregex="\\w+@\\w+(\\.\\w+)+";
Pattern p=Pattern.compile(mailregex);

while((line=bufIn.readLine())!=null)
{
Matcher m=p.matcher(line);
while(m.find())
{
System.out.println(m.group());
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息