【Java学习笔记】13.正则表达式

来源:互联网 发布:江苏警方破获网络诈骗 编辑:程序博客网 时间:2024/04/28 06:12

1.正则表达式语法
1.正则表达式:符合一定规则的字符串

**
将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如,”n”匹配字符”n”。”\n”匹配换行符。序列”\”匹配”\”,”(“匹配”(“。
^
匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与”\n”或”\r”之后的位置匹配。
$
匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与”\n”或”\r”之前的位置匹配。
*
零次或多次匹配前面的字符或子表达式。例如,zo* 匹配”z”和”zoo”。* 等效于 {0,}。
+
一次或多次匹配前面的字符或子表达式。例如,”zo+”与”zo”和”zoo”匹配,但与”z”不匹配。+ 等效于 {1,}。
?
零次或一次匹配前面的字符或子表达式。例如,”do(es)?”匹配”do”或”does”中的”do”。? 等效于 {0,1}。
{n}
n 是非负整数。正好匹配 n 次。例如,”o{2}”与”Bob”中的”o”不匹配,但与”food”中的两个”o”匹配。
{n,}
n 是非负整数。至少匹配 n 次。例如,”o{2,}”不匹配”Bob”中的”o”,而匹配”foooood”中的所有 o。”o{1,}”等效于”o+”。”o{0,}”等效于”o*”。
{n,m}
M 和 n 是非负整数,其中 n <= m。匹配至少 n 次,至多 m 次。例如,”o{1,3}”匹配”fooooood”中的头三个 o。’o{0,1}’ 等效于 ‘o?’。注意:您不能将空格插入逗号和数字之间。
?
当此字符紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式是”非贪心的”。”非贪心的”模式匹配搜索到的、尽可能短的字符串,而默认的”贪心的”模式匹配搜索到的、尽可能长的字符串。例如,在字符串”oooo”中,”o+?”只匹配单个”o”,而”o+”匹配所有”o”。
.
匹配除”\r\n”之外的任何单个字符。若要匹配包括”\r\n”在内的任意字符,请使用诸如”[\s\S]”之类的模式。
x|y
匹配 x 或 y。例如,’z|food’ 匹配”z”或”food”。’(z|f)ood’ 匹配”zood”或”food”。

2.Pattern类
(1) 8种模式:比如启用多行模式,启用unix模式等,eg int CASE_INSENSITIVE表示启用不区分大小写的模式。
(2) 4个静态方法
两个单例模式构造器:
Pattern compile(String regex);
Pattern compile(String regex,int flags)flags为八种模式的一种
eg2:
Pattern p=Pattern.compile(“[a-z]\s[a-z]”);
Matcher m=p.matcher(“b c”);
if(m.matches()) Sysout(1111);
else Sysout(2222); 输出结果为1111;
一个匹配方法,一个返回String的字面值模式方法:
boolean matches(String regex,CharSequence input);//input与regex匹
配返回true。
String quote(String s);//返回指定String的字面值。
eg3:boolean bool=Pattern.matches(“[a-z] [a-z]”,”bc”); //结果为true
Sysout(Pattern.quote(“a_#/tb”));//输出结果为 “\Qa_# b”\E
(3) 6个普通方法
返回此模式的匹配器: Matcher matcher(CharSequence input);
返回此模式的标志: int flags();
返回此模式的regex: String pattern();
两个字符串切割方法: String[] split(CharSequence input);
String[] split(CharSequence input,intlimit);
limit为返回字符串的个数,如果等于0,返回所有拆分的字符串,如果大于拆分字符串的实际个数,返回实际个数。
toString方法: String toString();

3.示例
1.例如:案例:键盘录入qq号码,校验QQ号码。
需求:
1:要求必须是5-15位数字
2:0不能开头

import java.util.Scanner;/** * 案例: 键盘录入qq号码,校验QQ号码。  * 需求: 1:要求必须是5-15位数字          * 2:0不能开头 */public class RegexDemo {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        // 键盘录入qq号码        System.out.println("请输入您的qq号码");        // 获取录入数据        String qq = sc.nextLine();        //创建方法,里面使用正则表达式实现        System.out.println(isCheck2(qq));    }    private static boolean isCheck2(String qq) {        //定义正则表达式        String reg = "[1-9][0-9]{4,14}";        return qq.matches(reg);    }}

2.校验电话号码

public class RegexDemo {    public static void main(String[] args) {        // 校验电话号码        /*         * 13245678901 13332345678 13456789012 18812345678 18999999999         * 18666666666 18786868686         */        //定义正则表达式        String reg = "1[38][0-9]{9}";        //System.out.println("键盘输入电话号码");        String number = "13245678901";        System.out.println(number.matches(reg));    }}

3.切割字符串

import java.util.Arrays;/* *   我有如下一个字符串:”91 27 46 38 50”       请写代码实现最终输出结果是:”27 38 46 50 91” */public class SplitExercise {    public static void main(String[] args) {        String str = "91 27 46 38 50";        //设定正则表达式        String reg = " ";        //运用split方法切割        String[] strs = str.split(reg);        //将String数组转换为int数组并排序        int[] arr = new int[strs.length];        for (int i = 0; i < arr.length; i++) {            arr[i] = Integer.parseInt(strs[i]);        }        //排序        Arrays.sort(arr);        //将int[]转换为StringBuffer        StringBuffer sb = new StringBuffer();        for (int i = 0; i < arr.length; i++) {            sb.append(arr[i]+" ");        }        //将StringBuffer转换为String        System.out.println(sb.toString());    }}
0 0
原创粉丝点击