正则表达式(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次 |
上述的操作貌似没有什么实际意义,那么下面写一点有意义的例子。
比如说检查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到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不在范围内,运行结果如下:
身份证号判断通常在用户实名认证的时候,不过现在基本上都会使用第三方平台直接接入,不过依然还是要知道怎么判断的身份证号。可以这么来写。
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。 可以使用自己的身份证进行一下验证,有问题的话告诉我,我及时改正。
你会发现这个正则表达式好长,一下子人就看懵了,下面进行逐步的分解。
分析:
这么一来你是不是觉得正则表达式挺有意思的,手动滑稽
public String[] split(String regex)
这个分割其实在开发中很常见的,下面举例说明。
public static void main(String[] args) {
String dateStr = "2021-07-11";
for (String s : dateStr.split("-")) {
System.out.println(s);
}
}
运行结果:
上面是通过 - 来分割字符串变成一个字符串数组,然后遍历打印。
例如有一个字符串里面有数字和字母,我要得到字母,
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)
public static void main(String[] args) {
String str = "abc123";
String resultStr = str.replaceAll("\\d+", "defg");
System.out.println(resultStr);
}
将数字替换为字母,运行一下:
public static void main(String[] args) {
String str = "2021-07-11";
String resultStr = str.replaceAll("-", "/");
System.out.println(resultStr);
}
这篇文章后续还会更新,后续我会写一个工具类或者方法自己的库里面去,用于Android依赖使用,山高水长,后会有期~