黑马程序员——正则篇

来源:互联网 发布:航拍软件 编辑:程序博客网 时间:2024/04/28 16:33
------- android培训、java培训、期待与您交流! ----------

概述

    正则表达式就是符合一定规则的字符串

使用步骤

    ①.先用字符串定义规则

        String regex = "[1-9][0-9]{4,14}";

    ②.通过String类的matches(String regex)方法匹配

        boolean flag = s.match(regex);

/* * 正则表达式:符合一定规则的字符串。 * 案例:校验QQ号码 */public class RegexDemo {public static void main(String[] args) {// 创建键盘录入对象Scanner sc = new Scanner(System.in);System.out.println("请输入你的QQ号码:");String qq = sc.nextLine();System.out.println("checkQQ:" + checkQQ(qq));}//方式1public static boolean checkQQ(String qq) {String regex ="[1-9][0-9]{4,14}";//public boolean matches(String regex)告知此字符串是否匹配给定的正则表达式boolean flag = qq.matches(regex);return flag;}//方式2public static boolean checkQQ(String qq) {return qq.matches("[1-9][0-9]{4,14}");}//方式3public static boolean checkQQ(String qq) {return qq.matches("[1-9]\\d{4,14}");}

常见规则

1.字符

    x 字符 x。举例:'a'表示字符a

    \\ 反斜线字符。

    \n 新行(换行)符 ('\u000A') 

    \r 回车符 ('\u000D')

2.字符类

    [abc] a、b 或 c(简单类)

    [^abc] 任何字符,除了 a、b 或 c(否定) 

    [a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围) 

    [0-9] 0到9的字符都包括

3.预定义字符类

    . 任何字符。我的就是.字符本身,怎么表示呢? \.

    \d 数字:[0-9]

    \w 单词字符:[a-zA-Z_0-9]

    在正则表达式里面组成单词的东西必须有这些东西组成

4.边界匹配器

    ^ 行的开头

    $ 行的结尾 

    \b 单词边界

    就是不是单词字符的地方。

    举例:hello world?haha;xixi

5.Greedy 数量词 

    X? X,一次或一次也没有

    X* X,零次或多次

    X+ X,一次或多次

    X{n} X,恰好 n 次 

    X{n,} X,至少 n 次 

    X{n,m} X,至少 n 次,但是不超过 m 次 

常见功能:(分别用的是谁呢?)

1.判断功能

    String类的public boolean matches(String regex)

/* * 判断功能 *String类的public boolean matches(String regex) * * 需求: * 判断手机号码是否满足要求? *  * 分析: * A:键盘录入手机号码 * B:定义手机号码的规则 * 13436975980 * 13688886868 * 13866668888 * 13456789012 * 13123456789 * 18912345678 * 18886867878 * 18638833883 * C:调用功能,判断即可 * D:输出结果 */public class RegexDemo {public static void main(String[] args) {//键盘录入手机号码Scanner sc = new Scanner(System.in);System.out.println("请输入你的手机号码:");String phone = sc.nextLine();//定义手机号码的规则String regex = "1[38]\\d{9}";//调用功能,判断即可boolean flag = phone.matches(regex);//输出结果System.out.println("flag:"+flag);}}
/* * 校验邮箱 *  * 分析: * A:键盘录入邮箱 * B:定义邮箱的规则 * 1517806580@qq.com * liuyi@163.com * linqingxia@126.com * fengqingyang@sina.com.cn * fqy@itcast.cn * C:调用功能,判断即可 * D:输出结果 */public class RegexTest {public static void main(String[] args) {//键盘录入邮箱Scanner sc = new Scanner(System.in);System.out.println("请输入邮箱:");String email = sc.nextLine();//定义邮箱的规则//String regex = "[a-zA-Z_0-9]+@[a-zA-Z_0-9]{2,6}(\\.[a-zA-Z_0-9]{2,3})+";String regex = "\\w+@\\w{2,6}(\\.\\w{2,3})+";//调用功能,判断即可boolean flag = email.matches(regex);//输出结果System.out.println("flag:"+flag);}}

2.分割功能

    String类的public String[] split(String regex)

/* * 分割功能 *String类的public String[] split(String regex) *根据给定正则表达式的匹配拆分此字符串。  * * 举例: * 百合网,世纪佳缘,珍爱网,QQ * 搜索好友 * 性别:女 * 范围:"18-24" *  * age>=18 && age<=24 */public class RegexDemo {public static void main(String[] args) {//定义一个年龄搜索范围String ages = "18-24";//定义规则String regex = "-";//调用方法String[] strArray = ages.split(regex);////遍历//for(int x=0; x<strArray.length; x++){//System.out.println(strArray[x]);//}//如何得到int类型的呢?int startAge = Integer.parseInt(strArray[0]);int endAge = Integer.parseInt(strArray[1]);//键盘录入年龄Scanner sc = new Scanner(System.in);System.out.println("请输入你的年龄:");int age = sc.nextInt();if(age>=startAge && age<=endAge) {System.out.println("你就是我想找的");}else {System.out.println("不符合我的要求,gun");}}}

public class RegexTest {public static void main(String[] args) {// 定义一个字符串String s = "91 27 46 38 50";// 把字符串进行分割,得到一个字符串数组String[] strArray = s.split(" ");// 把字符串数组变换成int数组int[] arr = new int[strArray.length];for (int x = 0; x < arr.length; x++) {arr[x] = Integer.parseInt(strArray[x]);}// 对int数组排序Arrays.sort(arr);// 把排序后的int数组在组装成一个字符串StringBuilder sb = new StringBuilder();for (int x = 0; x < arr.length; x++) {sb.append(arr[x]).append(" ");}//转化为字符串String result = sb.toString().trim();//输出字符串System.out.println("result:"+result);}}

3.替换功能

    String类的public String replaceAll(String regex,String replacement)

/* * 替换功能 *  String类的public String replaceAll(String regex,String replacement) *  使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。  */public class RegexDemo {public static void main(String[] args) {// 定义一个字符串String s = "helloqq12345worldkh622112345678java";// 我要去除所有的数字,用*给替换掉// String regex = "\\d+";// String regex = "\\d";//String ss = "*";// 直接把数字干掉String regex = "\\d+";String ss = "";String result = s.replaceAll(regex, ss);System.out.println(result);}}

4.获取功能

    Pattern和Matcher

    Pattern p = Pattern.compile("a*b");

    Matcher m = p.matcher("aaaaab");

    find():查找存不存在group():获取刚才查找过的数据

/* * 获取功能 *Pattern和Matcher类的使用 * *模式和匹配器的基本使用顺序 */public class RegexDemo {public static void main(String[] args) {// 模式和匹配器的典型调用顺序// 把正则表达式编译成模式对象Pattern p = Pattern.compile("a*b");// 通过模式对象得到匹配器对象,这个时候需要的是被匹配的字符串Matcher m = p.matcher("aaaaab");// 调用匹配器对象的功能boolean b = m.matches();System.out.println(b);//这个是判断功能,但是如果做判断,这样做就有点麻烦了,我们直接用字符串的方法做String s = "aaaaab";String regex = "a*b";boolean bb = s.matches(regex);System.out.println(bb);}}

/* * 获取功能: * 获取下面这个字符串中由三个字符组成的单词 * da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu? */public class RegexDemo2 {public static void main(String[] args) {// 定义字符串String s = "da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu?";// 规则String regex = "\\b\\w{3}\\b";// 把规则编译成模式对象Pattern p = Pattern.compile(regex);// 通过模式对象得到匹配器对象Matcher m = p.matcher(s);// 调用匹配器对象的功能// 通过find方法就是查找有没有满足条件的子串// public boolean find()// boolean flag = m.find();// System.out.println(flag);// // 如何得到值呢?// // public String group()// String ss = m.group();// System.out.println(ss);//// // 再来一次// flag = m.find();// System.out.println(flag);// ss = m.group();// System.out.println(ss);while (m.find()) {System.out.println(m.group());}// 注意:一定要先find(),然后才能group()// IllegalStateException: No match found// String ss = m.group();// System.out.println(ss);}}

0 0