正则表达式
对字符串操作的一种逻辑公式。就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤。
java API中有正则表达式符号所代表的含义。
匹配:
[ ]内只表示一位。
String类中的matches方法,用正则表达式规则匹配字符串,只要有一处不同就返回false。
编写正则表达式,来过滤QQ号,QQ号第一位不能是0,五位到12位之间,只能是数字。
class RegexDemo
{
public static void main(String[]args)
{
match();
}
public static void match()
{
String qq="452111a111";
String regex="[1-9]\\d{4,11}";//[1-9]表示第一位是1到9,\d表示数字,java中\表示转义字符,所以需要\\d,数后跟{4,11}说明后面的数字至少4位,最多11位
System.out.println(qq.matches(regex));
}
}
切割
String类中的split方法,可以按照正则表达式对字符串进行切割。
class RegexDemo
{
public static void main(String[]args)
{
splitDemo();
}
public static void splitDemo()
{
//String str="wangwu.lisi.gyt";//按照.进行切割,.在正则表达式中有任意字符的意义,所有需要加\
//String regex="\\.";
String str="vdsfgaaetregmqqfosdzzgdf";//分割叠字
String regex="(.)\\1";//(.)小括号定义为组,\n则可以引用组的内容,,组从1开始计数,这里的\1指用来引用第一组的值。
String[]arr=str.split(regex);
for(String x:arr)
{
System.out.println(x);
}
}
}
替换
String类中的replaceAll方法,把符合正则表达式的字符串给替换成指定的内容
class RegexDemo
{
public static void main(String[]args)
{
replaceAllDemo();
}
public static void replaceAllDemo()
{
/*String str="sdfds4984561sdf78984121sdasyh594315";
String regex="\\d{5,}";
String newstr="#";
str=str.replaceAll(regex,newstr);//将字符串中的数字替换成#
System.out.println(str);*/
String str="erkkkdsdfqqqqqfdsfsuyzzgfdsggggg";
String regex="(.)\\1+";
String newstr="$1";
str=str.replaceAll(regex,newstr);
System.out.println(str);//将重复的字符替换成一个字符,$n 取正则表达式中的组。
}
}
获取
Pattern类
正则表达式的编译表示形式。
指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher 对象,依照正则表达式,该对象可以与任意字符序列匹配。
Matchar类中有更多的关于正则表达式的方法。
import java.util.regex.*;
class RegexDemo
{
public static void main(String[]args)
{
getDemo();
}
public static void getDemo()
{
String str="hello my name is cui i come from china.";
String regex="\\b[a-zA-Z]{4}\\b";
Pattern p=Pattern.compile(regex);//将正则表达式封装成Pattern对象
Matcher m=p.matcher(str);//将此正则表达式对象与要匹配的字符串关联,得到Matcher对象。
while(m.find())//用Matcher中的find方法寻找是否有符合正则表达式的字符串
{
System.out.println(m.group());//进行取出
System.out.println(m.start()+"----"+m.end());
}
}
}
编程:利用正则表达式对一串IP字符串进行排序。
思路:按空格分隔,然后相比,有可能会出现 10和2的比较,但因为是一位一位比,所以10会在2字段的前面,所以我们需要把所有字段变为三位,进行比较。
import java.util.*;
class RegexTest1
{
public static void main(String[]args)
{
String str="192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30";
String regex="(\\d+)";//先将前面添加两个0,因为最低字段也是1位
String newstr="00$1";
str=str.replaceAll(regex,newstr);
System.out.println(str);
regex="0*(\\d{3})";//去除多余的0,让每个字段都为3位
newstr="$1";
str=str.replaceAll(regex,newstr);
System.out.println(str);
String[]arr=str.split(" ");//按空格切割
TreeSet<String> ts=new TreeSet<String>();//将其放入TreeSet集合,按照自然排序进行自动排序
for (String s:arr)
{
ts.add(s);
}
for(String s:ts)
{
System.out.println(s.replaceAll("0*(\\d+)","$1"));//去掉前面的0
}
}
}
编程:判断输入的邮箱地址是否正确。
class RegexTest2
{
public static void main(String[]args)
{
String str="XXXXXXX@qq.com";
String regex="[a-zA-Z1-9][a-zA-Z0-9_]{4,11}@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";//第一位是字母或者1-9,后几位是字母数字或者下划线,然后是@,然后是域名,然后是.com之类的,还有可能是.com.cn所以将前面定义为组,然后最多三个。
System.out.println(str.matches(regex));
}
}