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。$ 表示结束。
这么一来你是不是觉得正则表达式挺有意思的,手动滑稽
二、分割
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依赖使用,山高水长,后会有期~
以上是关于Android 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章
正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性