Java正则表达式

快速入门

		String regStr = "\\d\\d\\d\\d"; \\d 表示任意数字//有()代表分几组
        Pattern pattern = Pattern.compile(regStr);
        Matcher matcher = pattern.matcher(s);
        //根据规则找到满足规则的子字符串 
        //将子字符串的开始索引记录到matcherd的int[] groups的(初始化size=20 全为-1) group[0] 此处为0
        //子字符串的结束索引记录到group[1] 此处为4
        //lastold 记录group[1]的值为4 下次find就从4开始匹配
        //
		//(//d//d)(//d//d) 如找到数字1999 (19)(99)
		//  groups[0] = 0; groups[1] =4;
		//记录(19) groups[2] =0 groups[3] =3;
		//记录(99) groups[4]=2 groups[5] = 4
        while (matcher.find()){
            System.out.println(matcher.group(0));
        }

	public String group(int group) {
        if (first < 0)
            throw new IllegalStateException("No match found");
        if (group < 0 || group > groupCount())
            throw new IndexOutOfBoundsException("No group " + group);
        if ((groups[group*2] == -1) || (groups[group*2+1] == -1))
            return null;
        return getSubSequence(groups[group * 2], groups[group * 2 + 1]).toString();
    }

总结
正则表达式()分组
match.group(0) 表示取出全部字符串
match.group(1)表示取出第一组
match.group(2)表示取出第二组
分几组取几组,否则取到groups[?] = -1 会数组越界

正则转义符

\转义号 检索特殊符号需要加上 如 \( 来检索 (
java 的\相当于其他语言的
需要用到的有 .*+()$/?[]^{}

字符匹配符

[ ]可接收的字符,[abcd] 可接收abcd中的任意一个

[^] 不可接收的字符] [^abcd]除adcd的任意字符 数字 和特殊字符

-连接符 A-Z [A-Z]
. 匹配除\n外的任何字符 a…b 以a开头b结尾中间任意2个 匹配自己用\.
\d 单个数字字符 相当于[0-9] \d{3}(\d)? \d{3}表示3个数字 (\d)? 可能有一个数字 总体表示3或者4个数字
\D 非数字的字符 \D(\d)* 非数字开头后面任意个字符
\w 单个数字或者大小写字母 下划线 \d{3}\w{4} 3个数字开头后面4个可以数字和字母
\W非数字 非大小写字母 \w+\d{2} 非数字字母开头 2个数字结尾
\s 匹配空白字符(空格 制表符等)
\S 非空白字符
(?i)abc 不区分abc大小写
a(?i)bc bc不区分大小写
a((?i)b)c b不区分大小写
Pattern.compile(regStr,Pattern.CASE_INSENSITIVE); //匹配不区分大小写

选择匹配符 |

限定符 * + ? {n}

指定字符出现0或N次 (abc)*
指定字符出现1或者n次 m+ (abc)* 至少一个m开头,后面接任意个abc
指定字符出现0或1次 m + abc? 一个m开头 后接ab或者abc的字符串
只能输入n个字符 [abcd]{3} abcd中字母组成任意长度为3的字符串 aaa abc acd
{n,} 不少于n [abcd]{3,} abcd中字母组成长度不少于3的字符串
{n,m} n<= <=m [abcd]{3,5} abcd中字母组成长度不少于3 不大于5的字符串

定位符

^指定起始字符 ^ [0-9]+[a-z]* 至少一个数字开头任意小写字母结尾
$ 指定结束字符 ^ [0-9] \\ -[a-z]+$ 一个数字开头连接字符"-",以最少一个小写字母结尾
\\b 匹配目标字符的边界 hello\\b hello结尾 nihaohello [边界可以是字符串最后,也可以是空格前的最后]
\\B \\b相反 hello\\B hello开头 hellonihao

命名捕获

		String  s = "hello hello123 123hello";
        String reg = "(?<hello>\\d\\d)(?<hi>\\d)";
        Pattern pattern = Pattern.compile(reg);
        Matcher matcher = pattern.matcher(s);
        while(matcher.find()){
            System.out.println(matcher.group(0));
            System.out.println(matcher.group(1));
            System.out.println(matcher.group("hello"));
            System.out.println(matcher.group(2));
            System.out.println(matcher.group("hi"));
        }

非捕获分组

在这里插入图片描述

    String  s = "石猴孙悟空六耳猕猴通臂猿猴";
//        String reg = "石猴|猕猴|猿猴";
//        String reg = "(?:石|猕|猿)猴";//石猴 猕猴 猿猴 不能matcher.group(1)
//        String reg = "猴(?=孙|通)";//猴 猴 (?=)不能放前面 不能matcher.group(1)
        String reg = "(?!石|猕)猴";//猴 猴 猴
        Pattern pattern = Pattern.compile(reg);
        Matcher matcher = pattern.matcher(s);
        while(matcher.find()){
            System.out.println(matcher.group(0));
        }

非贪婪匹配

String reg = "\\d+";
String reg = "\\d+?";

整体匹配

		String  s = "11111111111";
        String reg = "\\d+";
        System.out.println(Pattern.matches(reg,s));//整体匹配

反向引用

	 String  s = "11djdasdjj2323lll88sdlkj7887ghhj6776fffghh44444";
//        String reg = "(\\d)\\1{4}";//匹配5个相同的数字
//        String reg = "(\\d)\\1";//匹配2个相同的数字
//        String reg = "(\\d)(\\d)\\1\\2";//匹配AbAb
        String reg = "(\\d)(\\d)\\2\\1";//匹配AbbA
        Pattern pattern = Pattern.compile(reg);
        Matcher matcher = pattern.matcher(s);
        while (matcher.find()){
            System.out.println(matcher.group(0));
        }

去重

		String  s = "11djdasdjj2323lll88sdlkj7887ghhj6776fffghh44444";
        String reg = "(.)\\1+";
        Pattern pattern = Pattern.compile(reg);
        Matcher matcher = pattern.matcher(s);
        while (matcher.find()){
            System.out.println(matcher.group(0));
        }
        String s1 = matcher.replaceAll("$1");
        System.out.println(s1);

        String s2 = Pattern.compile(reg).matcher(s).replaceAll("$1");
        System.out.println(s2);

正则表达式参考大全

一、校验数字的表达式
1 数字:^[0-9]*$
2 n位的数字:^\d{n}$
3 至少n位的数字:^\d{n,}$
4 m-n位的数字:^\d{m,n}$
5 零和非零开头的数字:^(0|[1-9][0-9]*)$
6 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$
71-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?$
8 正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$
9 有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
101~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
11 非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$
12 非零的负整数:^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$
13 非负整数:^\d+$ 或 ^[1-9]\d*|0$
14 非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
15 非负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
16 非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
17 正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
18 负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
19 浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

二、校验字符的表达式

1 汉字:^[\u4e00-\u9fa5]{0,}$
2 英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
3 长度为3-20的所有字符:^.{3,20}$
426个英文字母组成的字符串:^[A-Za-z]+$
526个大写英文字母组成的字符串:^[A-Z]+$
626个小写英文字母组成的字符串:^[a-z]+$
7 由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
8 由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$
9 中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$
10 中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
11 可以输入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+
12 禁止输入含有~的字符:[^~\x22]+


三、特殊需求表达式
1 Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
2 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
3 InternetURL[a-zA-z]+://[^\s]*^https://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
4 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
5 电话号码("XXX-XXXXXXX""XXXX-XXXXXXXX""XXX-XXXXXXX""XXX-XXXXXXXX""XXXXXXX"和"XXXXXXXX)^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$ 
6 国内电话号码(0511-4405222021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
7 身份证号:
		1518位身份证:^\d{15}|\d{18}$
		15位身份证:^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$
		18位身份证:^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$
8 短身份证号码(数字、字母x结尾)^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
9 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线)^[a-zA-Z][a-zA-Z0-9_]{4,15}$
10 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线)^[a-zA-Z]\w{5,17}$
11 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间)^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$ 
12 日期格式:^\d{4}-\d{1,2}-\d{1,2}
13 一年的12个月(0109112)^(0?[1-9]|1[0-2])$
14 一个月的31(0109131)^((0?[1-9])|((1|2)[0-9])|30|31)$ 
15 钱的输入格式:
16 1.有四种钱的表示形式我们可以接受:"10000.00""10,000.00", 和没有 "分""10000""10,000"^[1-9][0-9]*$ 
17 2.这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$ 
18 3.一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$ 
19 4.这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧.下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$ 
20 5.必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 "10""10.2" 是通过的:^[0-9]+(.[0-9]{2})?$ 
21 6.这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$ 
22 7.这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$ 
23 8.13个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$ 
24 备注:这就是最终结果了,别忘了"+"可以用"*"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里
25 xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
26 中文字符的正则表达式:[\u4e00-\u9fa5]
27 双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2ASCII字符计1))
28 空白行的正则表达式:\n\s*\r (可以用来删除空白行)
29 HTML标记的正则表达式:<(\S*?)[^>]*>.*?|<.*? /> (网上流传的版本太糟糕,上面这个也仅仅能部分,对于复杂的嵌套标记依旧无能为力)
30 首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)
31 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)
32 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
33 IP地址:\d+\.\d+\.\d+\.\d+ (提取IP地址时有用)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值