Android 正则表达式

Posted 初学者-Study

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 正则表达式相关的知识,希望对你有一定的参考价值。

介绍

  正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

使用

  正则表达式的可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。

下面来使用一些基本的元字符进行操作,用代码来示例,
\\ 一个斜杠表示将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。

一、判断

使用

public boolean matches(String regex)

例如"\\\\d",表示检查是否为数字。

		System.out.println("a".matches("\\\\d"));
        System.out.println("1".matches("\\\\d"));

“a”和“1”表示要检查的字符,matches表示开始检查,“\\\\d”表示检查规则,\\\\d表示检查数字。

运行结果:

如果是一串数字的话就不能这么写了。如果我的字符串是1234567890,那么就是匹配多次,就要是使用 * 了,例如

System.out.println("1234567890".matches("\\\\d*"));

执行之后返回true。 * 表示匹配次数为0次或者多次,这样的符号还有一些其他的,如下表所示

符号次数
*0次或多次
+1次或多次
?0次或1次
{n}刚好n次
{n,m}n到m次

上述的操作貌似没有什么实际意义,那么下面写一点有意义的例子。

1. 手机号判断

比如说检查13、15、19开头的手机号,那么就可以这么写。

	public static void main(String[] args) {
        String phoneNum = "1[359]\\\\d{9}";
        String[] phoneArr = {"13575137717","15575137717","19575137717","195751377171""1957513771"};

        for (String s : phoneArr) {
            System.out.println(s.matches(phoneNum));
        }
    }

下面来说一下这个正则表达式 1[359]\\\\d{9} ,1表示开头的字符,[359]表示里面的3、5、9任意一个字符,后面的\\\\d表示检查数字,{9}表示匹配9次,加上前面的两位就是11位,下面运行一下,看这个结果就很明显了,

最后两个为什么为false呢,因为有一个12位数字,一个是10位数字,不符合手机号的要求。

2. 姓名判断

正则其实还判断是否为中文,例如:汉族人的姓名通常是2到4个字,那么就可以这么来写。

	public static void main(String[] args) {
        
        String userNameRegex = "^[\\\\u4e00-\\\\u9fa5]{2,4}";

        String[] nameArr = {"王","段誉","李世民","诸葛山珍","西毒欧阳锋"};
        for (String name : nameArr) {
            System.out.println(name.matches(userNameRegex));
        }
    }

下面来解释一下:^ 是匹配输入字符串开始的位置,\\u4e00-\\u9fa5”是unicode编码,一种全世界语言都包括的一种编码。(国际化功能中常常用到),\\u4e00-\\u9fa5是用来判断是不是中文的一个条件。{2,4}是匹配2到4次,一个匹配一个字符,所以1和5不在范围内,运行结果如下:

3. 身份证号判断

身份证号判断通常在用户实名认证的时候,不过现在基本上都会使用第三方平台直接接入,不过依然还是要知道怎么判断的身份证号。可以这么来写。

	public static void main(String[] args) {

        String idCardRegex = "^[1-9]\\\\d{5}(18|19|20)\\\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\\\d{3}([0-9Xx])$";
        String idCard = "430428196808158292";
        System.out.println(idCard.matches(idCardRegex));
    }

可以运行一下,肯定是true。 可以使用自己的身份证进行一下验证,有问题的话告诉我,我及时改正。

你会发现这个正则表达式好长,一下子人就看懵了,下面进行逐步的分解。

分析:

  • [1-9]\\\\d{5}表示身份证前6位,也就是地址码。
  • (18|19|20)\\\\d{2},表示年份,这里的|表示或者的意思,也就是说18、19、20。\\\\d{2}表示具体的年份。这里的年份可以根据实际业务需要自己再去更改。
  • ((0[1-9])|(1[0-2])) 表示月份,月份是01 - 12。(0[1-9]),表示0开头,[1-9]就可以匹配除0之外任意一个数字,如果月份不是0开头,就会进入(1[0-2]),匹配范围就是10、11、12。
  • (([0-2][1-9])|10|20|30|31),这里表示日期,01-31。([0-2][1-9])表示,01-09、11-19、21-29,然后通过|10|20|30|31补齐剩余的日期。
  • \\\\d{3} 顺序码,数字即可。
  • ([0-9Xx])$ 校验码 ,校验码可以是0 - 9 、X、x。$ 表示结束。

4. QQ判断

在日常的应用注册中,对于QQ的检查也是常见的,而QQ号最短是5位、最长是10位。第一个数字在1-9之间,第二个数字在0-9之间。因此可以这样写:

	public static void main(String[] args) {
        String qqRegex = "[1-9][0-9]{4,9}";
        String[] qqStr = {"55555","123456","12337789","1317986759","0323429","47892799778"};
        for (String qq : qqStr) {
            System.out.println(qq.matches(qqRegex));
        }
    }

运行一下:

相信这个正则就不用解释了。

5. 邮箱判断

邮箱也是常用的,代码如下:

	public static void main(String[] args) {
        String emailRegex = "^\\\\w+([-+.]\\\\w+)*@\\\\w+([-.]\\\\w+)*\\\\.\\\\w+([-.]\\\\w+)*$";
        String[] emailStr = {"lonelyholiday@qq.com","123@163.com","dadadadasd@","www.casda@"};
        for (String email : emailStr) {
            System.out.println(email.matches(emailRegex));
        }
    }

运行结果:

这个正则就有必要说一下了,

  • \\w 表示匹配字符,\\W表示匹配非字符。
  • [-+.] 表示可以使用 - 、+ 、.
  • @ 就是邮箱特有的符号
  • \\.表示除换行符以外的所有字符。

后面的就都是常规的了

这么一来你是不是觉得正则表达式挺有意思的,手动滑稽

二、分割

public String[] split(String regex)

这个分割其实在开发中很常见的,下面举例说明。

1. 字符分割

    public static void main(String[] args) {

        String dateStr = "2021-07-11";

        for (String s : dateStr.split("-")) {
            System.out.println(s);
        }
    }

运行结果:

上面是通过 - 来分割字符串变成一个字符串数组,然后遍历打印。

2. 字符串分割

例如有一个字符串里面有数字和字母,我要得到字母,

    public static void main(String[] args) {
        
        String str = "abc1123das32dsa36das34DA";

        for (String s : str.split("\\\\d+")) {
            System.out.println(s);
        }
    }

运行一下:

那如果要得到数字呢?

	public static void main(String[] args) {

        String str = "abc1123das32dsa36das34DA";
        
        for (String s : str.split("[a-zA-Z]+")) {
            System.out.println(s);
        }
    }

字母分大写小写,运行结果如下:

三、替换

public String replaceAll(String regex,String replacement)

1. 字符串替换

    public static void main(String[] args) {

        String str = "abc123";
        String resultStr = str.replaceAll("\\\\d+", "defg");
        System.out.println(resultStr);
    }

将数字替换为字母,运行一下:

2. 字符替换

	public static void main(String[] args) {

        String str = "2021-07-11";
        String resultStr = str.replaceAll("-", "/");
        System.out.println(resultStr);
    }


如果是android开发者的话可以是我的开源库里面,通过依赖直接使用相应的正则进行相应的检查

GitHub地址:EasyLibrary

库里是一些Android开发中常用的工具类,会一直更新,也希望多提宝贵意见。

欢迎Stat 和 Fork。

以上是关于Android 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

markdown 正则表达式模式片段

正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性

循环通过 python 正则表达式匹配

asp.net 使用正则表达式验证包含打开/关闭括号片段的属性字符串

Android正则表达式获取网页源链接

攻破难啃的骨头-正则表达式(转)