高级的字符串处理——正则表达式(一)
这一章是讲了一个快速判断用户是不是输入正确格式字符串的方法,如果你会了可以不看。(调用public boolean matches(String regex)方法)
引例:
一天你的女朋友突然问你:亲爱的~~在我之前你交了几个女朋友啊?
可是你并不像确切的告诉她,于是你说了有”\dgirlfriend”
女友说什么意思?你有过几个女朋友,三个?四个?
为了防止她猜出,你面无表情的说都对。
在这里\d是一个有特殊意义的元字符,代表0~9中任何一个,”0girlfriend””1girlfriend””2girlfriend”…”9girlfriend”都是和正则表达式”\dgirlfriend”匹配的字符序列。
所以只要女友说的是10以内的自然数,都是对的。
一、常用正则表达式写法及其意义
. 代表任何一个字符
\d代表0~9中任意一个数
\D代表任意非数字字符
\s代表空格类字符’\t’’\n’’\x0B’’\f’’\r’
\S代表非空格类字符
\w代表可用于标识符的字符(不包括$)
\W代表不能用于标识符的字符
\p{Lower}代表小写字母[a-z]
\P{Upper}代表大写字母[A-Z]
\p{ASCII}ASCII字符(一种编码)
\p{Alpha}字母
\p{Digit}数字字符[0-9]
\p{Alnum}数字或字母
\p{Punct}标点符号!“#¥%&’()**+,-./<=>?@[]^_`{|}~
\p{Graph}可视字符\p{Alnum}\p{Punct}
\p{Print}可打印字符\p{Print}
\{Blank}空格或制表符[\t]
\p{Cntrl}控制字符[\x00-\x1F\x7F]
这些是加一个\就是正则表达式的写法(.除外)
注:由于“.”代表任何一个字符,所以在正则表达式中如果想使用普通意义的点字符,必须使用[.]或\56表示普通意义的点字符
二、表示元字符
在正则表达式中可以用方括号括起若干个字符串来表示一个元字符
String regex = “[139]girlfriend“
”1girlfriend””3girlfriend””9girlfriend”都是和正则表达式regex匹配的序列。
基础:
[abc]:代表a,b,c中任何一个
[^abc}:代表除了a,b,c以外的任何字符
[a-zA-Z]:代表英文字母中的任何一个
[a-d]:代表a~d中任何一个
进阶:
中括号里允许嵌套中括号,可以进行并 交 差运算
[a-d[m-p]]:代表ad或mp中的任何字符(并)
[a-z&&[def]]:代表d e f中任何一个(交)
[a-f&&[^bc]]:代表a d e f(差)
三、限定修饰符
X? X出现0或1次
X* X出现0或多次
X+ X出现1或多次
X{n} X恰好出现n次
X{n,} X至少出现n次
X{n,m} X出现n次至m次
XY X的后缀是Y
X|Y X或Y
String regex = “girl[246]?”;
“girl”“girl2”“girl4”“girl6”都是与正则表达式regex匹配的字符串
String regex = “@\\w{4}”;
“@abcd””@南瓜仔仔””@Java”都是匹配的字符串
四、案例
用户在输入用户名,我们要判断用户名是否由英文字母、数字或下划线组成
import java.util.Scanner;
public class Example {
public static void main(String[] args) {
String regex = "[a-zA-Z|0-9|_]+";
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
if(str.matches(regex)){
System.out.println(str + "是否由英文字母、数字或下划线组成");
}else {
System.out.println(str + "中有非法字符");
}
}
}