正则表达式初步
预定义字符类
一个预定义字符只能匹配一个字符,如果想要让一个预定义字符匹配多个字符,必须要使用数量词。
表示 | 含义 | 实例 | 结果 |
---|---|---|---|
\\d | [0-9的数字] | System.out.println("数字字符"+"1".matches("\\d")) |
true |
. | 任意字符 | System.out.println("任意字符"+"a".matches(".")) |
true |
\\D | 非数字字符 | System.out.priintln("非数字字符"+"a".matches("\\D")) |
true |
\\s | 空白字符 | 回车\r、换行\n、\t等都属于空白字符 | |
\\S | 非空白字符 | 除空白字符以外的字符 | |
\\w | 单词字符,包括[a-z][A-Z][_][0-9] | `System.out.println(“单词字符”+”@”.matches(“\w”))’ | false |
\\W | 非单词字符 | `System.out.println(“单词字符”+”@”.matches(“\w”))’ | true |
数量词
在第一部分中已经说明了数量词的作用,下面来说明数量词的使用方法。
数量词 | 含义 | 实例 | 实例含义 |
---|---|---|---|
? | 表示一次或者一次也没有 | \\d? |
表示数字出现一次或者一次都不出现 |
* | 表示零次或者多次 | \\d* |
数字出现0次或者多次 |
+ | 至少出现一次 | \\d+ |
数字至少出现一次,一次都不出现时是false |
{n} | 恰好出现n次 | \\d{5} |
数字恰好出现5次 |
{n,} | 至少要出现指定的n次 | \\d{3,} |
数字至少要出现3次 |
{n,m} | 至少n次,但是不超过m次 | \\d{3,5} |
数字至少出现3次,但是不超过5次 |
范围词
范围词中不管你写多少个字符,没有数量词的配合,也只能匹配一个字符。
范围词 | 含义 | 实例 | 实例含义 |
---|---|---|---|
[abc] | abc中的一个 | [abcd] | a,b,c,d中的一个 |
[^abc] | 除了a、b、c之外的字符 | [^abcd] | 除了abcd之外的字符 |
[a-zA-Z#]|字符可以使a-z之间的任意字符包含和# | [a-z0-9] | 任意小写字符或者数字都可以 |
操作字符串实例
正则表达式主要是用于操作字符串的规则,正则表达式对字符串的操作主要包含以下的集中应用:
匹配
切割
替换
查找
匹配
匹配使用String中的matches方法。
需求1:编写一个正则表达式匹配一个手机号,手机号的规则包含:
- 第一位是1开头;
- 第二位可以是3、4、5、7、8,
- 长度是11位。
public Demo{
public static void main(String[] args){
String telPhone = "15338607191";
System.out.println(telPhone.matches("1[34578]\\d{9}"?"合法手机号":"非法的手机号"));
}
}
需求2:匹配固定电话号码,首先需要分析清楚规则,区号+主机号 区号:首位是0,长度3-4位 主机号:首位不能是0,长度是7-8位。
public Demo{
public static void main(String[] args){
String telPhone = "0353-8869125";
System.out.println(telPhone.matches(telPhone.matches("0\\d{2,3}-[1-9]\\d{6,7}")?合法固话:非法固话);
}
}
切割
切割只要使用的是java.lang.String中的split方法,从方法的原型中可以看出,split方法可以接收一个正则表达书作为形式参数。
需求:根据重叠词进行切割
class Demo{
public static void main(String[] args){
}
public static void testSplit(){
String str = "大家家家明天天玩得得得得得得得开心";
str.split("(.)\\1+"); //如果正则表达式的内容需要被复用,那么需要对正则表达式的内容进行分组,分组的目的就是为了提高正则表达式的复用性,组号不能指定,组号默认是从1开始。
}
}
解释上面正则的含义:
替换
替换用的是java.lang.String中的replaceAll方法,该方法的参数是一个正则表达式。
需求:将“我我我要要要要做做做项项项项项项项项项项目”替换成“我要做项目”
class Demo{
public static void main(String[] args){
replaceTest();
}
public static void replaceTest(){
String str = "我我我要要要要做做做项项项项项项项项项项目";
str = str.replaceAll("(.)\\1+","$1");//如果需要在replaceAll方法正则表达式的外部引用组的内容,那么需要使用的是"$组号"便可实现。
System.out.println(str);
}
查找
查找不能使用java.lang.String中的方法来解决,只能使用正则对象来实现,其中要用到两个:Pattern(正则对象)、Matcher(匹配器对象)。在 Matcher对象呗创建之后,所有关于正则表达式是否成功的匹配,以及匹配之后的所有结果都保存在Matcher中,此时我们需要使用Matcher类中的方法来查找到底有什么内容,在这个类中经常用的方法有两个:find()、group(),其中find方法是确定是否匹配了正则表达式的内容,而group()方法则是将匹配的内容正确的输出,在使用group方法的时候一定要先调用find方法让你匹配器中查找符合规则的字符串,否则报错,也就是说必须同时使用,不搭配使用编译器会报错。
需求:找出三个字母组成的单词
public class Demo{
public static void main(String[] args){
String content = "da jia de jia qi wang bi liao hai kai xin ma";
String reg = "\\b[a-zA-Z]{3}\\b";
//先要把字符串的正则表达式编译为Pattern的对象
Pattern p = Pattern.compile(reg);
//使用正则对象匹配字符串产生一个Matcher对象
Matcher m = p.macher(content);
System.out.println("有符合规则的字符串吗?"+m.find());
while(m.find()){
System.out.println("找到的元素为:"+m.group());
}
}
}
参考资料
- 正则表达式必知必会下载地址:http://download.csdn.net/detail/jpzhu16/9483521