正则表达式
一.正则表达式是指符合一定规则的表达式,它是用来专门操作字符串。如匹配字符串、查找字符串、替换字符串等。可以说,正则表达式是一段文本或一个公式,它是用来描述用某种模式去匹配一类字符串的公式,是字符串功能组合起来操作复杂数据的代表不多的优化。
特点:用于一些特定的符号来表示一些代码操作。这样就简化书写。
因此学习正则表达式,就是在学习一些特殊符号的使用。
如对QQ号码的检验
要求:5~15 0不能开头,只能是数字,长度为5到15的范围内。
这种方式,使用了String类中的方法,进行组合完成了需求。但是代码过于复杂。
public static void checkQQ()
{
String qq = "1882345a0";
int len = qq.length();
if(len>=5 && len<=15)
{
if(!qq.startsWith("0")) //判断是否为0开头
{
char[] arr = qq.toCharArray();//将字符串转为数组,判断每个字符是否为数字
boolean flag = true;
for(int x=0;x<arr.length; x++)
{
if(!(arr[x]>='0' && arr[x]<='9'))
{
flag = false; //判断标识
break;
}
}
if(flag)
{
System.out.println("qq:"+qq);
}
else
{
System.out.println("出现非法字符");
}
*/
}
else
{
System.out.println("不可以0开头");
}
}
else
{
System.out.println("长度错误");
}
}
}
但是用了正则表达式,根本就不用这么多代码。
public static void checkQQ()
{
String qq = "123a454";
String regex = "[1-9]\\d{4,14}"; //第一个数字为1~9,//d 表示数字,{4,14}表示//d即数字至少出现4次,最多14次。
boolean flag = qq.matches(regex);
if(flag)
System.out.println(qq+"...is ok");
else
System.out.println(qq+"... 不合法");
}
二.正则表达式的具体操作功能:
1,匹配:String matches方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。则表达式实现方法:
String str="a";
String reg="[abcd]';
boolean b=str.matches(reg); //match判断是否符合正则表达式
常用构造方摘要:
字符类 (只出现一次) | |
---|---|
[abc] | a、b 或 c(简单类) |
[^abc] | 任何字符,除了 a、b 或c(否定) |
[a-zA-Z] | a 到 z 或 A 到 Z,两头的字母包括在内(范围) |
[a-d[m-p]] | a 到 d 或 m 到 p:[a-dm-p](并集) |
[a-z&&[def]] | d、e 或 f(交集) |
[a-z&&[^bc]] | a 到 z,除了 b 和 c:[ad-z](减去) |
[a-z&&[^m-p]] | a 到 z,而非 m 到 p:[a-lq-z](减去) |
预定义字符类 | |
---|---|
. | 任何字符(与行结束符可能匹配也可能不匹配) |
\d | 数字:[0-9] |
\D | 非数字: [^0-9] |
\s | 空白字符:[ \t\n\x0B\f\r] |
\S | 非空白字符:[^\s] |
\w | 单词字符:[a-zA-Z_0-9] |
\W | 非单词字符:[^\w] |
Greedy 数量词(即出现次数) | |
---|---|
X? | X,一次或一次也没有 |
X* | X,零次或多次 |
X+ | X,一次或多次 |
X{n} | X,恰好 n 次 |
X{n,} | X,至少 n 次 |
X{n,m} | X,至少 n 次,但是不超过m 次 |
练习
匹配
手机号段只有 13xxx 15xxx 18xxxx
public static void checkTel()
{
String tel = "16900001111";
String telReg = "1[358]\\d{9}";
System.out.println(tel.matches(telReg));
}
2.切割功能 String split();
class RegexDemo
{
public static void main(String[] args)
{
splitDemo("num1,num2,num3",",") //此处按照,号进行切割,依次打印num1 num2 num3
}
public static void splitDemo(String str,String reg)
{
String[] arr = str.split(reg);
System.out.println(arr.length);
for(String s : arr)
{
System.out.println(s);
}
}
}
特殊情况:
- 对空格的切割要注意,可能会字符串之间有多个空格的情况,有两个以上空格 用" +"。
splitDemo("num1 num2 num3"," +") //按照多个空格来切割
- 如果正则表达式用"."来切割的话,会什么都没有。为什么呢?因为"."代表任意字符,导致所有字符都被切割了。
splitDemo("num1.num2.num3","\\.") //按照.来切割
- 切割绝对路径的像 ("d:\\abc\\a.txt") 用"\\\\" 转义一下
splitDemo("d:\\abc\\a.txt","\\\\")
- 按照叠词完成切割。
2.1.splitDemo("abccdkkboodd","cc"); 只切割cc的叠词
2.2.splitDemo("abccdkkboodd","(.)\\1"); 可以切割cc,kk,oo 的叠词 ,可以将规则封装成一个组。用()完成。组的出现都有编号。即是第一位的 内容在第二位也出现了//从1开始。 想要使用已有的组可以通过 \n(n就是组的编号)的形式来获取。
2.3.splitDemo("abccccccccdkkbooooooodd","(.)\\1+"); 切割2个以上的叠词。
-
String str1 = "abccccccccdkkbooooooodd"; //将重叠的字符替换成单个字母。cccccccc->c
replaceAllDemo(str1,"(.)\\1+","$1"); //另外一个符号获取组里面的符号 $1 前一个规则的第一个组,如果没有写的话整个一个组,0组.
- 4.获取功能 按照规则把指定的子字符串取出来
-
3.替换功能 String replaceAll(regex,str); 把符合正则表达式的字符替换成自定义的字符
class RegexDemo
{
public static void main(String[] args)
{
replaceAllDemo("num1,num2,num3",",",".....") //此处按照,号进行替换成..... 依次打印num1.....num2.....num3
}
public static void replaceAllDemo(String str,String reg,String newStr){
str = str.replaceAll(reg,newStr);
System.out.println(str);
}
}
特殊情况:
4.1 Java正则表达式基础知识:由上可看出
- 将正则表达式封装为对象Pattern,需要引用java.util.regex包。
Pattern 常用方法:
|-- static Pattern compile(String regex) 将给定的正则表达式编译到模式中。
int flags() 返回此模式的匹配标志。
Matcher matcher(CharSequence input) 创建匹配给定输入与此模式的匹配器。 - String 里面的match()方法用的是Pattern 和 Matcher 来完成的,只不过用来封装是简单些。
Matcher m = p.matcher(str);
System.out.println(m.matches());
- 匹配器 Matcher ,需要引用java.util.regex包。
Matcher 常用方法:
|--int end()
返回最后匹配字符之后的偏移量。
int end(int group)
返回在以前的匹配操作期间,由给定组所捕获子序列的最后字符之后的偏移量。
boolean find()
尝试查找与该模式匹配的输入序列的下一个子序列。
String group()
返回由以前匹配操作所匹配的输入子序列。
int start()
返回以前匹配的初始索引。 - 匹配时,只有去找到,才能去取。 find()--> group()
注意:如果先使用了matches() 方法,再使用find()方法,后者会调用前者索引后的指针位置开始找,因为这两个方法所用的指针是一样的。
import java.util.regex.*;
class RegexDemo2
{
public static void main(String[] args)
{
getDemo();
}
public static void getDemo()
{
String str = "ming tian jiu yao fang jia le ,da jia。";
System.out.println(str);
String reg = "\\b[a-z]{4}\\b";
//将规则封装成对象。
Pattern p = Pattern.compile(reg);
//让正则对象和要作用的字符串相关联。获取匹配器对象。
Matcher m = p.matcher(str);
//System.out.println("matches:"+m.matches()); //这里使用指针会改变。
while(m.find()) //将规则作用到字符串上,并进行符合规则的子串查找。
{
System.out.println(m.group());
System.out.println(m.start()+"...."+m.end());
}
}
}