正则表达式:
符合一定规则的字符串,字符串处理手段。
常用正则表达式的规则:
符号 | 说明 | 举例1 | 举例2 | 举例3 |
---|---|---|---|---|
\ | 转义字符,将后一个字符标记为特殊字符或者将元字符转为原意字符 | \\ 表示匹配原意字符\ | \. 表示匹配英文句号". " | \d 表示匹配数字 |
. | 匹配除换行\n以外的任意字符 | abc. 能匹配到abc 后面的那个字符(任意) | ||
^ | 在[ ] 外匹配字符串的开始位置,在[ ]内表示非 | ^\d\d\d 能匹配字符串"134"等,但不能匹配字符串"a134"等 | ^\w+\b 匹配第一个单词 | [^ajl] 匹配除了"a",“j”,"l"以外的任意字符 |
$ | 匹配字符串的结束位置 | ^\d\d\.\d\d$ 可以匹配"12.00","13.23"等 | ||
? | 匹配前面的子表达式0次或1次 | good? 可以匹配"goo"和"good" | ||
+ | 匹配前面的子表达式至少一次 | ok+ 可以匹配"okk"和"okkkkk"等,但不可匹配"ok" | ||
* | 匹配前面的子表达式0次或多次 | ok* 可以匹配"ok"和"okkkkkkk"等 | ||
{n} | 匹配前面的子表达式n次 | \d{11} 连续匹配11个数字 | ||
{n,m} | 匹配前面子表达式n到m次 | \d{7,11} 匹配7到11个数字 | ||
{n,} | 匹配前面的子表达式n次以上 | \d{5,} 匹配连续的5个以上的数字 | ||
\w | 匹配字母,数字,下划线,等价于[a-zA-Z_0-9] | abc\w 表示匹配"abc"开头并且后面跟着一个字母或数字或下划线的字符串(注意三者是或的关系) | ||
\W | 匹配非字母,非数字,非下划线 | |||
\d | 匹配数字 | \d\d\d 表示匹配三个数字 | ||
\D | 匹配非数字,相当于[^\d] | |||
[xyz] | 表示字符集,匹配所包含的任意一个字符 | [abc] 匹配"a"或"b"或’c" | [!$*.?] 匹配"!“或”$“或”*“或”?" | |
[n-m] | 表示字符范围,能匹配范围内的任意一个字符 | [a-z] 匹配26个小写字母中的任意一个字母 | [0-9] 匹配0到9的任意数字,和\d效果相同 |
注意:
1.
如果想查找元字符本身的话,比如.
,\
和*
,就出现了问题,你没办法指定他们,因为他们会被解释成别的意思,这时需要使用\
来取消这些字符的特殊意义,即\.
,\\
和\*
。
2.
在其他的语言中,一个反斜杠\
就足以具有转义的作用,而在 Java 中正则表达式中则需要有两个反斜杠才能被解析为其他语言中的转义作用。也可以简单的理解在 Java 的正则表达式中,\\
代表其他语言中的一个\
,这也就是为什么表示一位数字的正则表达式是\\d
,而表示一个普通的反斜杠是\\\\
。
正则表达式的举例:
-
判断手机号码是否符合要求:
号码的第一位为1
号码的第二位为3或8
号码一共有9位
可得正则表达式可为:"1[38][0-9]{9}"
或"1[38]\\d{9}"
-
判断邮箱是否符合要求:
1517806580@qq.com
liuyi@163.com
lifnnfnn@126.com
fas@itcast.cn
dfksdk@sina.com
可得正则表达式可为:"\\w+@\\w{2,6}(\\.\\w{2,3})+"
或"[a-zA-Z_0-9]+@[a-zA-Z_0-9]{2,6}(\\.[a-zA-Z_0-9]{2,3})+"
正则表达式的功能:
1.判断功能:String类中matches()方法
- boolean matches(String regex):告知此字符串是否匹配给定的正则表达式。
public static void main(String[] args)
{
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入邮箱");
String email= sc.nextLine();
//定义邮箱的正则表达式
//String regex = "[a-zA-Z_0-9]+@[a-zA-Z_0-9]{2,6}(\\.[a-zA-Z_0-9]{2,3})+";
String regex = "\\w+@\\w{2,6}(\\.\\w{2,3})+";
//调用String类中matches()方法
boolean flag = email.matches(regex) ;
//输出结果
System.out.println(flag);
}
public static void main(String[] args)
{
{
//键盘录入一个QQ号码
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个qq号码:");
String qq = sc.nextLine();
//定义QQ号码的正则表达式
String regex = "[1-9][0-9]{4,14}";
//调用String类中的matches()方法
boolean flag = qq.matches(regex);
//输出结果
System.out.println(flag);
}
}
- 分割功能:String类中split()方法
- public String[] split(String regex):根据给定正则表达式的匹配拆分此字符串
Integer类下的parseIn()方法可以将字符串参数解析为int类型的整数。
- public static int parseInt(String s):将字符串参数解析为有符号的整数。
s - 包含要解析的整数表示形式的 String
例:编写程序搜索好友,年龄:18-24
public static void main(String[] args)
{
//定义一个年龄搜索范围
String ages = "18-24";
//定义正则表达式
String regex = "-";
//调用split()方法
String[] strArray = ages.split(regex);
//将字符串参数转换为int类型的值
int startAge = Integer.parseInt(strArray[0]);
int endAge = Integer.parseInt(strArray[1]);
//键盘录入年龄
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的年龄:");
int age = sc.nextInt();
if(age>=startAge && age<=endAge)
{
System.out.println("你就是我想要的");
}
else
{
System.out.println("滚");
}
}
例:字符串的分割
public static void main(String[] args)
{
String s = "aa,bb,cc";
String regex = ",";
String[] strArray = s.split(regex);
for(int x=0;x<strArray.length ;x++)
{
System.out.println(strArray[x]);
}
String s2 = "aa.bb.cc";
String[] str2Array = s2.split("\\.");
for(int x=0;x<str2Array.length ;x++)
{
System.out.println(str2Array[x]);
}
String s3 = "aa bb cc";
String[] str3Array = s3.split(" +");//空格一次以上
for(int x=0;x<str3Array.length ;x++)
{
System.out.println(str3Array[x]);
}
//硬盘上的路径,用\\替代\
String s4 = "E:\\javaSE\\day14\\avi";
String[] str4Array = s4.split(" \\\\");//在java规则中\\代表\
for(int x=0;x<str4Array.length ;x++)
{
System.out.println(str4Array[x]);
}
}
例: 已知字符串:“91 27 46 38 50”,写程序使代码最终输出结果:’'27 38 46 50 91"
public static void main(String[] args)
{
//定义一个字符串
String s = "91 27 46 38 50";
//把字符串进行分割得到一个字符串数组
String[] strArray = s.split(" ");//按照一个空格来分
//把字符串数组变成int数组
int[] arr = new int[strArray.length];
for(int x = 0;x<arr.length;x++)
{
//字符串数组的每一个元素给int数组的每一个元素
arr[x] = Integer.parseInt(strArray[x]);
}
//对int数组进行排序
Arrays.sort(arr);
//把排序后的int数组再组装成一个字符串
StringBuilder sb = new StringBuilder();
for(int x=0;x<arr.length;x++)
{
sb.append(arr[x]).append(" ");
}
//转为字符串
String result = sb.toString().trim();
//输出字符串
System.out.println("result:"+result);
}
- 替换功能:String类的replaceAll()方法
String replaceAll(String regex,String replacement)
使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
public static void main(String[] args)
{
//定义一个字符串
String s = "hello12345world622112345678java";
//去除所有的数字,用*给替换掉
String regex = "\\d+";
String ss = "*";
String result = s.replaceAll(regex, ss);
System.out.println(result);
String regex1 = "\\d";
String result1 = s.replaceAll(regex1, ss);
System.out.println(result1);
String regex2 = "\\d+";
String ss1 = " ";
String result2 = s.replaceAll(regex2, ss1);
System.out.println(result2);
}
- 获取功能:
模式和匹配器的典型调用顺序:
Pattern类和Matcher类
Pattern p = Pattern.compile(“a*b”);
Matcher m = p.matcher(“aaaaab”);
boolean b = m.matches();
- public static Pattern compile(String regex)将给定的正则表达式编译到模式中。
- public Matcher matcher(CharSequence input)创建匹配给定输入与此模式的匹配器。
- public boolean matches()尝试将整个区域与模式匹配
- public boolean find(int start)扫描输入序列以查找与该模式匹配的下一个子序列。
- public String group()返回由以前匹配操作所匹配的输入子序列。
例:获取字符串中三个字符组成的单词
da jia ting wo shuo ,jin tin yao xia yu ,bu shang wan zi xi ,gao xing bu?
public static void main(String[] args)
{
//定义字符串
String s = "da jia ting wo shuo ,jin tin yao xia yu ,bu shang wan zi xi ,gao xing bu?";
//规则
String regex = "\\b\\w{3}\\b";//\b表示单词边界,即不是单词字符的地方,\w表示单词字符:[a-zA-Z_0-9]
//把正则表达式编译成模式对象
Pattern p = Pattern.compile(regex);
//通过模式对象得到匹配器对象,这个时候需要的是被匹配的字符串
//public Matcher matcher(CharSequence input)创建匹配给定输入与此模式的匹配器。其中input为要匹配的字符序列 ,返回的是此模式的新匹配器
Matcher m = p.matcher(s);
/*
//调用匹配器对象的功能
//public boolean find(int start)扫描输入序列以查找与该模式匹配的下一个子序列。
//调用find方法查找有没有满足条件的子序列
boolean flag = m.find();
System.out.println(flag);
//得到具体的值
//public String group()返回由以前匹配操作所匹配的输入子序列。
String ss = m.group();
System.out.println(ss);
//再来一次
flag = m.find();
System.out.println(flag);
ss = m.group();
System.out.println(ss);
*/
while(m.find())
{
System.out.println(m.group());
}
/*
//注意一定要先find,才能group,否则报错
Stirng ss = m.group();
System.out.println(ss);
*/
}