正则表达式
正则表达式用来验证字符串符不符合规则、要求
表达式实例
1."\s"
\s+ —— \s表示空格,+表示空格可以有1-多个
比如——this\s+is\s+text
在java中需要转译
在其他语言中,\ 表示:我想要在正则表达式中插入一个普通的(字面上的)反斜杠,请不要给它任何特殊的意义。
在 Java 中,\ 表示:我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。
public static boolean isText1(String str){
Pattern p = Pattern.compile("this\\s+is\\s+text");
Matcher m = p.matcher(str);
return m.matches();
}
正则表达式很刻板,格式必须一模一样,一一对应
this is text!
thisis text
都显示格式错误!
2. “.”
“.” 它匹配任何一个字符
public static boolean isNumOrChar(String str){
Pattern p = Pattern.compile("school.class");
Matcher matcher = p.matcher(str);
return matcher.matches();
public static void main(String[] args) {
boolean tag = isNumOrChar("school3class");
if (tag){
System.out.println("格式正确");
}else {
System.out.println("格式错误");
}
}
school.class中school与class之间可以加随便单个字符,但一个.只能容忍匹配一个字符
3."\d"
\d+ 匹配一个或多个数字
public static boolean isNum(String str){
Pattern p = Pattern.compile("^\\d\\.\\d\\d");
Matcher matcher = p.matcher(str);
return matcher.matches();
}
\d表示单个数字,\.表示单个点,不代表别的字符,\d\.\d\d两位小数
捕获组
捕获组是把多个字符用小括号括起来当成一个单独的单元进行处理的方法,它通过对括号内的字符分组来创建
我们可以将小鼠进行分组,再通过group(组号)进行调用
public static boolean isNum(String str){
Pattern p = Pattern.compile("(\\d\\.)(\\d)(\\d)");
Matcher matcher = p.matcher(str);
if (matcher.find()){
System.out.println("匹配到");
System.out.println(matcher.group(0));
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
System.out.println(matcher.group(3));
}else {
System.out.println("没有匹配");
}
return matcher.matches();
}
public static void main(String[] args) {
boolean tag = isNum("5.28");
if (tag){
System.out.println("格式正确");
}else {
System.out.println("格式错误");
}
}
如上图:0代表的是最外面的那个括号,代表整个表达式
正则表达式语法
+表示前面的组有1到多个,都成立
*表示前面的组有0到多个,都成立
?表示0或1次,感觉跟或的意思差不多
{n} n 是非负整数。正好匹配 n 次。
{n,}表示至少有n个
{n,m} 至少n次,至多m次
\ 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如, n匹配字符 n。
\n 匹配换行符。序列 \\ 匹配 \ ,\( 匹配 (。
^代表字符串的开头位置
$代表字符串的结尾位置
(?=pattern)执行正向预测先行搜索的子表达式,该表达式匹配处于匹配 pattern 的字符串的起始点的字符串。个人理解的是判断写的字符串中是否包含pattern
举个例子:
Pattern p = Pattern.compile("^[A-Z](?=.*[a-zA-Z].*)(?=.*[0-9].*)[a-zA-Z0-9]{0,7}");
这段代码表示了一串以大写字母开头的,同时包含字母和数字的一串最长8位数的字符串
(?=.*[a-zA-Z].*)//表示查找字符串中有无大小写字母,.*表示对字母前后紧接的字符没有特殊要求,只要存在字母即可
(?!pattern)执行反向预测先行搜索的子表达式,该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。
(?:pattern)匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。这对于用"or"字符 (|) 组合模式部件的情况很有用。例如,'industr(?:y|ies) 是比 ‘industry|industries’ 更经济的表达式。
x|y表示匹配x或y
^(135|139|133|137)//表示这串字符串只能以135 139 133 137开头
[xyz]
字符集。匹配包含的任一字符。例如,"[abc]“匹配"plain"中的"a”。
[^xyz]
反向字符集。匹配未包含的任何字符。例如,"[^abc]“匹配"plain"中"p”,“l”,“i”,“n”。
[a-z]
字符范围。匹配指定范围内的任何字符。例如,"[a-z]"匹配"a"到"z"范围内的任何小写字母。
[^a-z]
反向范围字符。匹配不在指定的范围内的任何字符。例如,"[^a-z]"匹配任何不在"a"到"z"范围内的任何字符。
\b 匹配一个字边界,即字与空格间的位置。例如,“er\b"匹配"never"中的"er”,但不匹配"verb"中的"er"。只匹配边界。
\B 匹配非字边界,“er\B"匹配"verb"中的"er”,但不匹配"never"中的"er"。
\d 数字字符匹配。等效于 [0-9]。
\D 非数字字符匹配。等效于 [ ^0-9 ]。