本文介绍的是通过String类中的matches方法传入正则表达式规则来解决问题。
一、为什么要使用正则表达式
正则表达式可以大大简化文本识别工作,现已超出了某种语言或某个系统的局限,成为被人们广为使用的工具。
package com.zz.bookManager.test;
public class Test {
public static void main(String[] args) {
// 例子:账户 必须纯数字 范围6-12
String username = "123456";
if (username.length() >= 6 && username.length() <= 12) {
boolean flag = true;// 可以
for (int i = 0; i < username.length(); i++) {
char chs = username.charAt(i);
if (!Character.isDigit(chs)) {
flag = false;
}
}
if (flag == true) {
System.out.println("OK");
} else {
System.out.println("不OK");
}
} else {
System.out.println("账户有误,必须在6-12之间");
}
// 正则表达式
String username2 = "123456abc";
// 定义规则 通过字符串定义
String regex = "[0-9]{6,12}";
// 调用String类中提供的方法来匹配规则是否满足要求
System.out.println(username2.matches(regex));
}
}
二、正则表达式快速入门
2.1 概述
正则表达式是由普通字符(如英文字母)以及特殊字符(也称为元字符)组成的文字模式。该模式对文本查找时需要匹配的一个或多个字符串描述,给出一个匹配模板。
- 正则表达式定义了字符串的模式。
- 正则表达式可以用来搜索、编辑或处理文本。
- 正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
2.2 创建方式
String str = "123456";//字符串
String regex = "\\d{6}";//正则表达式
str.matches(regex);//是否匹配规则
2.3 正则表达式规则
符号 | 含义 | 示例 | 解释 | 匹配输入 |
\ | 转义符 | \* | 符号“*” | * |
[ ] | 可接收的字符列表 | [efgh] | e、f、g、h中的任意1个字符 | e、f、g、h |
[^ ] | 不接收的字符列表 | [^abc] | 除a、b、c之外的任意1个字符,包括数字和特殊符号 | m、q、5、* |
| | 匹配“|”之前或之后的表达式 | ab|cd | ab或者cd | ab、cd |
( ) | 将子表达式分组 | (abc) | 将字符串abc作为一组 | abc |
- | 连字符 | A-Z | 任意单个大写字母 | 大写字母 |
符号 | 含义 | 示例 | 解释 | 匹配输入 | 不匹配输入 |
* | 指定字符重复0次或n次 | (abc)* | 仅包含任意个abc的字符串,等效于\w* | abc、abcabcabc | a、abca |
+ | 指定字符重复1次或n次 | m+(abc)* | 以至少1个m开头,后接任意个abc的字符串 | m、mabc、mabcabc | ma、abc |
? | 指定字符重复0次或1次 | m+abc? | 以至少1个m开头,后接ab或abc的字符串 | mab、mabc、mmmab、mmabc | ab、abc、mabcc |
{n} | 只能输入n个字符 | [abcd]{3} | 由abcd中字母组成的任意长度为3的字符串 | abc、dbc、adc | a、aa、dcbd |
符号 | 含义 | 示例 | 解释 | 匹配输入 | 不匹配输入 |
{n,} | 指定至少 n 个匹配 | [abcd]{3,} | 由abcd中字母组成的任意长度不小于3的字符串 | aab、dbc、aaabdc | a、cd、bb |
{n,m} | 指定至少 n 个但不多于 m 个匹配 | [abcd]{3,5} | 由abcd中字母组成的任意长度不小于3,不大于5的字符串 | abc、abcd、aaaaa、bcdab | ab、ababab、a |
^ | 指定起始字符 | ^[0-9]+[a-z]* | 以至少1个数字开头,后接任意个小写字母的字符串 | 123、6aa、555edf | abc、aaa、a33 |
$ | 指定结束字符 | ^[0-9]\-[a-z]+$ | 以1个数字开头后接连字符“–”,并以至少1个小写字母结尾的字符串 | 2-a、3-ddd、5-efg | 33a、8-、7-Ab |
符号 | 含义 | 示例 | 解释 | 匹配输入 | 不匹配输入 |
. | 匹配除 \n 以外的任何字符 | a..b | 以a开头,b结尾,中间包括2个任意字符的长度为4的字符串 | aaab、aefb、a35b、a#*b | ab、aaaa、a347b |
\d | 匹配单个数字字符,相当于[0-9] | \d{3}(\d)? | 包含3个或4个数字的字符串 | 123、9876 | 12、01023 |
\D | 匹配单个非数字字符,相当于[^0-9] | \D(\d)* | 以单个非数字字符开头,后接任意个数字字符串 | a、A342 | aa、AA78、1234 |
\w | 匹配单个数字、大小写字母字符,相当于[0-9a-zA-Z] | \d{3}\w{4} | 以3个数字字符开头的长度为7的数字字母字符串 | 234abcd、12345Pe | 58a、Ra46 |
\W | 匹配单个非数字、大小写字母字符,相当于[^0-9a-zA-Z] | \W+\d{2} | 以至少1个非数字字母字符开头,2个数字字符结尾的字符串 | #29、#?@10 | 23、#?@100 |
2.4 正则表达式举例
- 非负整数:“^\d+$ ”
- 正整数: “ ^[0-9]*[1-9][0-9]*$”
- 非正整数: “ ^((-\d+)|(0+))$”
- 整数: “ ^-?\d+$”
- 英文字符串: “ ^[A-Za-z]+$”
- 英文字符数字串: “ ^[A-Za-z0-9]+$”
- 英数字加下划线串: “^\w+$”
- E-mail地址:“^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$”
- URL:“^[a-zA-Z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\s*)?$”
package com.zz.bookManager.test;
public class Test {
public static void main(String[] args) {
// 【======正则示例======】
String str = "";
String regex = "";
// 1、匹配密码:6位的数字
str = "1234567";
regex = "\\d{6}";
System.out.println(str.matches(regex));
// 2、匹配用户名:由英文字母组成 长度必须在10-20之间
str = "adminadmin123";
regex = "[a-zA-Z]{10,20}";
System.out.println(str.matches(regex));
// 3、由abcdefg以及02468组成 长度在6位以上
// str = "abcabc";
// regex = "[abcdefg02468]{6,}";
regex = "[a-g02468]{6,}";
System.out.println(str.matches(regex));
// 4、匹配abcdefg 至少要选择一个
str = "asd";
regex = "[a-g]+";
System.out.println(str.matches(regex));
// 5、匹配abcdefg 选择一个 或者不选
str = "a";
regex = "[a-g]?";
System.out.println(str.matches(regex));
// 6、匹配出现任意次数的数字
str = "ajld";
regex = "\\d*";
System.out.println(str.matches(regex));
// 7、匹配正整数
str = "+111111";// +12
regex = "(\\+)?(\\d|[1-9]\\d*)";
System.out.println(str.matches(regex));
// 8、匹配负整数
str = "0";
regex = "\\-([1-9]|[1-9]\\d*)";
System.out.println(str.matches(regex));
// 9、匹配正整数和0
str = "+0";
regex = "((\\+)?(\\d|[1-9]\\d*))|0";
System.out.println(str.matches(regex));
// 10、匹配电子邮箱
str = "1561868458@qq.cn";
regex = "\\w{6,12}@\\w{2,5}\\.(com|cn)";
System.out.println(str.matches(regex));
// 11、匹配域名
str = "www.baidu.com";
regex = "(http://|https://|ftp://)?www\\.[0-9a-zA-Z]{3,6}\\.(com|cn|net|org)";
System.out.println(str.matches(regex));
// 12、匹配月份 1-12
str = "12";
regex = "[1-9]|1[0-2]";
System.out.println(str.matches(regex));
// 13、匹配日期 1-31
// 1-9 10-29 30 31
str = "22";
regex = "[1-9]|[12]\\d|3[01]";
System.out.println(str.matches(regex));
// 14、匹配年龄 1-150岁之间
str = "120";
regex = "[1-9]|[1-9]\\d|1[0-4]\\d|150";
System.out.println(str.matches(regex));
// 15、匹配手机号码
// (1)必须11位数
// (2)必须是1开头 第二个数字:3 4 5 6 7 8 9
str = "15084961293";
regex = "1[3-9]\\d{9}";
System.out.println(str.matches(regex));
// 16、匹配座机号码
// 区号---座机号---分机号
// 0738-4565773-01
str = "4565773";
regex = "(0\\d{2,3}\\-)?\\d{7,8}(\\-\\d{1,2})?";
System.out.println(str.matches(regex));
}
}