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

------- android培训、java培训、期待与您交流! ----------

正则表达式,最重要的还是四个功能。另外最好记住常用的字符匹配。

一、概念理解:

正则表达式:符合一定规则的表达式。

    作用:用于专门操作字符串。

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

    好处:可以简化对字符串的复杂操作。

    弊端:符号定义越多,正则越长,阅读性越差。

 

 

二、具体操作功能:

 

1,匹配:String  matches方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。

    主要方法:boolean matches(String regex)    告知此字符串是否匹配给定的正则表达式

正则表达式构造,简单举例说明:

对QQ号进行校验,要求:5~15位,0不能开头,只能是数字。就可以构造一个正则表达式如下: String regex = “[1-9][0-9]{4,14}” 意思是:第一位字符只能是1-9之间的数字,第二位只能是0-9之间的数字可以出现4-14次。

    举例:对邮件地址进行校验。

 

    public static voidcheckMail()

    {

        String mail ="[email protected]";

 

        mail= "[email protected]";

 

        Stringreg = "[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,切割:String split();

 

主要方法:String的String[] split(regex)方法。

但要注意split()括号里面的是reg字符串,都有“”的,应该多注意转义字符。故regex定义的时候一定要考虑转移字符的影响。

如,对于用一个点切割,该这样定义  String reg =” \\.”;因为在正则表达式中单独一个点代表任意字符,\.代表真正的点,考虑到反斜杠的转义作用,应该用”\\.” 注意,反斜杠后面有个点。

地址字符串中的目录分隔符(\\)要用两个。

用反斜杠切割,定义: String str = “\\\\“;

 

组的概念:

按照叠词完成切割,为了可以让规则的结果可以被重用,可以将规则封装成一个组,用()完成,组的出现都有编号。从1开始,想要使用已有的组,可以通过\n(n就是组的编号)来获取。但在字符串中,考虑到反斜杠转义作用,应写成\\n。 总之,两个\代表一个\。

举例:

class  RegexDemo

{

    public static voidmain(String[] args)

    {

        splitDemo("zhangsan.lisi.wangwu","\\.");

        splitDemo("c:\\abc\\a.txt","\\\\");

 

        splitDemo("erkktyqqquizzzzzo","(.)\\1+");

    }

 

3,替换:就是将符合一定规则的字符串替换成新的字符串。

主要方法:String replaceAll(regex,新字符串);

如果regex中有定义组,可以在第二参数中通过$符号获取正则表达式中的已有的组。

str.replaceAll(“(.)\\1+”,”$1”);

其中,$n  $表示从外界(不在一个双引号内)获取前面正则表达式中的一个组,n标示组的序号(组号是从1开始的,因为被操作的字符串默认为0组)。

举例如下:将以下字符串编程简单的一句话。

public static void test_1()

    {

        String str ="我...我我...我要..要要...要要...去去去...黑马";

        /*

        将已有字符串变成另一个字符串。使用 替换功能。

        1,可以先将 . 去掉。

        2,在将多个重复的内容变成单个内容。

        */

        str =str.replaceAll("\\.+","");

        System.out.println(str);

 

        str =str.replaceAll("(.)\\1+","$1");

       

        System.out.println(str);

 

    }

4,获取(重点):将字符串中符合规则的字串取出。

操作步骤:

1.    将正则表达式封装成对象。Pattern.compile(reg)

2.    让正则对象和要操作的字符串相关联。用 matcher(str)方法

3.    关联后获取正则匹配引擎。就是matcher()方法返回的Matcher对象,也叫匹配器。

4.    通过引擎对符合规则的字串进行操作。比如匹配用matches()方法,和取出。

注意:

1.     同一个匹配器用的是同一个指针。

2.     先找(匹配)才能取。用group()方法进行获取之前要先做查找/匹配的动作。

3.     正则表达式中的边界匹配器。要学会应用。比如单词的边界 \b  .

4.     匹配器m的matches()方法,是将整个字符串和规则进行匹配,完全符合规则才返回true值。

 

类 Pattern,在java.util.regx包中。

典型的调用顺序是: (先定义要被操作的str,和用的正则表达式reg,)

Pattern p = Pattern.compile(reg);

 Matcher m = p.matcher(str);

 boolean b = m.matches();

在仅使用一次正则表达式时,可以简化地定义为:

boolean b = Pattern.matches(reg, str);

等效于上面的三个语句

它不允许重用已编译的模式。

用到的方法简析:

static Pattern  compile(String regex)   将给定的正则表达式编译到模式中。

 Matcher  matcher(CharSequence input)    创建匹配给定输入与此模式的匹配器。

Matcher类:通过解释 Patterncharacter sequence 执行匹配操作的引擎。

Matcher类的主要方法:

boolean matches()尝试将整个区域与模式匹配。

boolean find()  尝试查找与该模式匹配的输入序列的下一个子序列

String group() 返回由以前匹配操作所匹配的输入子序列。(要先匹配一次才可以进行该操作)

int start();

int end();

 

举例如下:

mport java.util.regex.*;

 

class RegexDemo2

{

    public static voidmain(String[] args)

    {

        getDemo();

    }

    public static voidgetDemo()

    {

        String str ="ming tian jiu yao fang jia le ,da jia。";

        System.out.println(str);

        String reg ="\\b[a-z]{4}\\b";

 

        //将规则封装成对象。

        Pattern p =Pattern.compile(reg);

 

        //让正则对象和要作用的字符串相关联。获取匹配器对象。

        Matcher m  = p.matcher(str);

 

        while(m.find())

        {

            System.out.println(m.group());

            System.out.println(m.start()+"...."+m.end());

        }

    }

}

 

三、经验总结:到底用四种功能中的哪一个呢?或者哪几个呢?

    思路方式:

    1,如果只想知道该字符是否对是错,使用匹配。

    2,想要将已有的字符串变成另一个字符串,替换。

    3,想要按照自定的方式将字符串变成多个字符串。切割。获取规则以外的子串。

    4,想要拿到符合需求的字符串子串,获取。获取符合规则的子串。

 

 

你可能感兴趣的:(黑马程序员——正则表达式)