--------- android培训、java培训、期待与您交流! ----------
黑马程序员---正则表达式
一、正则表达式概述:
1、定义:我们在软件开发的时候,通过正则表达式来实现验证信息,会更方便。例如我们要输入邮箱地址,我就就要判断是不是合法的。或者用户名是不是合法的,都可以通过正则表达式来操作。因为用户名、密码、邮箱等都是一个个字符串,而正则表达式就是用来操作字符串的,它使我们在操作字符串的时候更加的简单、快捷了。那么什么是正则表达式呢?实际上它就是符合一定规则的表达式。
2、正则表达式的作用:它是用来专门操作字符串的。
3、正则表达式的特点:用一些特殊的符号表示一些代码操作。这样就简化了书写,所以正则表达式就是学习一些特殊的符号的使用。
4、正则表达式的好处:可以简化对字符串的复杂操作。
5、弊端:符号定义越多,正则就越长,阅读性就越差。
二、正则表达式的构造摘要:
1、字符:
x --------> 字符 x
\\--------> 反斜线字符
\0n --------> 带有八进制值 0 的字符 n (0 <= n <= 7)
\0nn --------> 带有八进制值 0 的字符 nn (0 <= n <= 7)
\0mnn --------> 带有八进制值 0 的字符 mnn(0 <= m <= 3、0 <= n <= 7)
\xhh --------> 带有十六进制值 0x 的字符 hh
\uhhhh-------->带有十六进制值 0x 的字符 hhhh
\t -------->制表符 ('\u0009')
\n --------> 新行(换行)符 ('\u000A')
\r--------> 回车符 ('\u000D')
\f -------->换页符 ('\u000C')
\a -------->报警 (bell) 符 ('\u0007')
\e--------> 转义符 ('\u001B')
\cx --------> 对应于 x 的控制符
经过视频的学习,我发现“\\”用的比较多,可能其它的以后在开发中也会遇到
2、字符类:
[abc] -------->a、b 或 c(简单类)
[^abc] -------->任何字符,除了 a、b 或 c(否定)
[a-zA-Z] -------->a 到 z 或 A 到 Z,两头的字母包括在内(范围)
[a-d[m-p]] -------->a 到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]] -------->d、e 或 f(交集)
[a-z&&[^bc]] -------->a 到 z,除了 b 和 c:[ad-z](减去)
[a-z&&[^m-p]] -------->a 到 z,而非 m 到 p:[a-lq-z](减去)
可以说字符类的正则符号在开发中比较常见的,用的也比较多,但是书写起来还是比较麻烦的,所以下面的预定义字符类简化了字符类的书写。
3、预定义字符类:
. -------->任何字符(与行结束符可能匹配也可能不匹配)
\d -------->数字:[0-9]
\D -------->非数字: [^0-9]
\s -------->空白字符:[ \t\n\x0B\f\r]
\S -------->非空白字符:[^\s]
\w -------->单词字符:[a-zA-Z_0-9]
\W -------->非单词字符:[^\w]
4、边界匹配器:
^ -------->行的开头
$ -------->行的结尾
\b -------->单词边界
\B -------->非单词边界
\A -------->输入的开头
\G -------->上一个匹配的结尾
\Z -------->输入的结尾,仅用于最后的结束符(如果有的话)
\z -------->输入的结尾
5、Greedy数量词:
X? -------->X,一次或一次也没有
X* -------->X,零次或多次
X+ -------->X,一次或多次
X{n} -------->X,恰好 n 次
X{n,} -------->X,至少 n 次
X{n,m} -------->X,至少 n 次,但是不超过 m 次
当然还有很多的正则符号,但是是不常见,所以这里就不一一例举了,想要了解更多的正则符号,请查看API文档。
6、组:
当你想要对一个规则的结果进行复用时,那么可以把它封装成线,这个组里的结构就可以被重新再次使用,这个组一封装穿完成以后,它会有一个自动的编号,是从1开始的。怎么使用第一个组呢?可以通过“\”来表示。例如规则(.)\1 表示第一个是任意字符,第二个字符是对第一个字符的重用,当把它写到String 中时就应该是这样写的:"(.)\\1"。但是有时间分组有很多的时候,例如表达式((A) (B(C)))中就有四个组,那么怎么看有几个组呢?我就就看有几个左括号,有几个左括号就有几个组,从这里我们就能看出来,正则表达式的弊端,正则越多,就越复杂。
三、正则表达式的功能
它有匹配、切割、替换和获取四个功能。
1、匹配:String matches方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。使用传统的方法,例如用if语句来判断,也能实现对字符串的判断,但是那个太复杂。所以下面来写一个匹配字符串的小程序来验证QQ号码和手机号码是不是正确的,代码如下:
import java.util.Scanner;
public class Demo1 {
/**
* 匹配字符串练习:完成对QQ号的验证
* 要求:输入的QQ号必须都是数字,0不能开头,5-15位
*/
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
System.out.println("请输入QQ号码:");
String str=input.next(); //得到用户输入QQ号码
String reg="[1-9]\\d{4,14}"; //定义规则
boolean flg=str.matches(reg); //将规则关联到字符串上
if(flg){
System.out.println("输入正确");
}else{
System.out.println("输入不合法");
}
}
}
2、切割:String split(),之前学过了split() 方法,那些都是很规则的,比如说按空格来切,那时我们的空格只有一个,那么现在空格多了又怎么弄呢?或者是按叠词来切的话,又怎么做呢?下面我们就来用正则表达式的方式来进行讲解,下面是代码实现:
public class Demo2 {
/**
* 切割练习:将字符串按照“ ,” 切割
*/
public static void main(String[] args) {
String str="zhangsan,li,wangwu"; //定义字符创
String reg=","; //定义规则
String [] arr=str.split(reg); //将规则作用到字符串上,并将切割出来的字符保存到数组中
for(String s:arr){
System.out.println(s); //打印数组元素
}
}
}
3、替换:String replaceAll(regex,str),如果regex中有定义组,可以在第二参数中通过$符号获取正则表达式中的已有的组。当我们不需要,或者要得到某个结果的时候我们就把把其中的不要信息有某些字符来代替,从而得到我们所要的结果。这时我们就用到了替换,下面是替换的一个小程序:
public class Demo3 {
/**
* 正则表达式:替换
* 练习:将字符串中的数字替换成*
*
*/
public static void main(String[] args) {
String Str="password123456"; //定义字符串
String str=Str.replaceAll("\\d{5,}", "*"); //调用replaceAll定义规则,将满足规则的字符替换成规定字符
System.out.println(str);
}
}
4、获取:将字符串中的符合规则的子串取出。
操作步骤:a,将正则表达式封装成对象。
b,让正则对象和要操作的字符串相关联。
c,关联后,获取正则匹配引擎。
d,通过引擎对符合规则的子串进行操作,比如取出。
下面是代码实现:
import java.util.regex.*;
class RegexDemo2
{
public static void main(String[] args)
{
getDemo();
}
public static void getDemo()
{
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);
//System.out.println(m.matches());//其实String类中的matches方法。用的就是Pattern和Matcher对象来完成的。
//只不过被String的方法封装后,用起来较为简单。但是功能却单一。
boolean b = m.find();//将规则作用到字符串上,并进行符合规则的子串查找。
System.out.println(b);
System.out.println(m.group());//用于获取匹配后结果。
System.out.println("matches:"+m.matches());
while(m.find())
{
System.out.println(m.group());
System.out.println(m.start()+"...."+m.end());
}
}
}
--------- android培训、java培训、期待与您交流! ----------