正则表达式的概念:在程序中经常需要对字符串这类数据进行合法的验证,如果没有其他的新技术,就只能采用字符串中
原始方法进行截取等各种判断,这样代码书写量很大,并且不利于程序的维护‘
于是,就提供了更加简便的技术来验证码字符串这类数据。这个技术就叫做正则表达式,
正则表达式:正确的规则组成的一个表达式,它可以验证其他的字符串数据的合法性。
正则表达式的书写规则
正则表达式是验证字符串:在正则表达式中书写的规则是限定字符串中不同位置上可以出现哪些字符数据。、
正则的书写:正则表达式的体现也是字符串,
现在验证字符串数据:"abc",条件是:第一位上只能书写小写啊,第二位上上可以书写b或c,第三位上写c或d或e;
则正则表达式为:a[bc][cde];
字符类:
解释正则表达式中[]的用法:书写[] 中的内容,是用来验证字符串中某个位置上可以书写的字符数据
字符串数据:”13499990000”
正则表达式:”1[34578][0-9]”验证前三位
解释正则表达式中{} 的用法:
X{N} X表达式的是正则的规则,后面的{N} 表达式的是前面的正则规则所在位置往后可以出现的次数
字符串数据:”13499990000”
正则表达式:”1[34578][0-9]{9}” 这个规则规定需要被验证的字符串中的第一位只能数字1,第二位是可以3、4、5、7、8中的任何一个,从第三位开始可以是0-9中的任何一个,一直到第11位。
X? X依然是正则的规则,?表达式的是X这个规则可以出现零次或一次
X* X依然是正则的规则,*表达式的是X这个规则可以出现零次或者多次
X+ X依然是正则的规则,+表达式的是X这个规则可以出现一次或者多次
字符串数据:”abc“
正则规则:”a?”
字符串数据:”abcABC”
正则规则:”.bcABC” 说明:当前的正则规定的字符串的第一位上可以是任何的字符数据
字符串数据:”13499990000”
正则表达式:”1[34578]\\d{9}”
. 表示任意字符数据
\d 表示数字字符
\w 表示字母 数字 下划线 (注意:没有 $ 符号)
正则演示:
验证手机号:
public class TelNumberCheck {
public static void main(String[] args) {
//定义正则规则
Stringregex = "1[34578][0123456789]\\d{8}";
Stringtel = "13345678901";
//验证
booleanb = tel.matches(regex);
//System.out.println(b);
if( b ){
System.out.println("手机号码正确");
}else{
System.out.println("手机号码有误");
}
}
}
1匹配功能
使用String类的matches方法完成;
/*
* 简单验证身份证号码正确性
*/
public class IDCardCheck {
public static void main(String[] args) {
//需要被验证的字符串数据
StringidCard = "11012219901212567X";
//正则的规则
Stringregex = "[1-9][0-9]{5}[12][0-9]{3}[01][0-9][0123][0-9]\\d{3}[0-9Xx]";
//调用String类中的匹配方法验证
booleanb = idCard.matches(regex);
System.out.println(b);
}
}
public static void method2() {
// 需要被切割的字符串数据
Strings = "abc....qwe..jk.........2322...22bcd.....3324";
/*
* 由于点(.)在正则中有特定的含义,如果在程序中需要使用点本身
* 就需要使用转义字符表示点
*/
Stringregex = "\\.+";
String[]strs = s.split(regex);
for (inti = 0; i < strs.length; i++) {
System.out.println(strs[i]);
}
}
// 使用正则切割字符串
public static void method() {
// 需要被切割的字符串数据
Strings = "abc qwe jkl 123 3432 324";
// 书写正则规则
Stringregex = " +";
String[]strs = s.split(regex);
for (inti = 0; i < strs.length; i++) {
System.out.println(strs[i]);
}
}
// 切割,要求按照不同的叠词进行切割
public static void method3() {
// 需要被切割的字符串数据
Strings = "abc##qwe###jklllll1232222bcd####abcccc3440123324";
/*
* 使用不同的叠词切割,由于不知道具体使用的是哪个叠词
* 字符串中的任何字符都有可能重复,这些字符都有可能作为切割的标准
*
* 我们不知道具体是哪个字符在重复,因此只能使用正则中的点(.)表示被切割的那个字符
* 只要这个字符重复了,就使用它作为切割标准。
*
* 只要当前这个点匹配上了这个字符,就必须要求这个字符后面的位置还要是这个字符
* 解决上述的这个问题:需要将已经匹配上的正则规则在当前这个位置的后面继续使用
* 这时就需要将这个规则封装成正则中的组,然后在后面的位置上使用这个组
*
* 正则中的组的书写格式:
* "(正则规则)后面就可以使用前面小括号中封装好的规则"
* 如果需要在当前这个正则中引用前面已经存在的组,格式是:
* \\组号
* 正则中只要使用小括号,就代表将某个规则封装成一个组,每个组都有自己默认的编号
* 正则中的组的编号从1开始,只要出现一个组,编号就自动+1.
*
* 例如:"(.)\\1" 先使用这个正则规则去匹配某个字符串中的第一个位置,如果匹配上之后
* 要求被匹配的第二个位置上的内容必须和第一个位置上的内容安全一致
*
* ((A)(B(C))) 共计有4个组:
* 第一组:((A)(B(C))) 1
* 第二组:(A) 2
* 第三组:(B(C)) 3
* 第四组:(C) 4
* 开发中尽量不要使用组或者是组的嵌套。
*
*/
Stringregex = "(.)\\1+";
String[]strs = s.split(regex);
for (inti = 0; i < strs.length; i++) {
System.out.println(strs[i]);
}
}
/*
* 使用正则替换字符串中的数据
*/
public class ReplaceDemo {
public static void main(String[] args) {
method4();
}
//正则替换练习
public static void method4() {
//将下面的字符串中的数据替换成“我要学Java编程”
Strings = "我我我我.......要要要要要要....学学学学学.......Java...编.....程程程程程程";
//先把字符串中的所有点干掉
Strings2 = s.replaceAll("\\.+", "");
System.out.println(s2);
//将不同的叠词替换成一个
String s3 = s2.replaceAll("(.)\\1+", "$1");
System.out.println(s3);
}
//使用正则的替换功能将手机号码中间四位替换成****
public static void method3() {
Stringtel = "13412345678";
//书写正则规则
Stringregex = "(1[34578][0-9])(\\d{4})(\\d{4})";
Stringstring = tel.replaceAll(regex, "$1****$3");
System.out.println(string);
}
// 将字符串中的多个不同的叠词替换中一个叠词
public static void method2() {
Strings = "ssjddklffffjsklddddjfkkkkklsdjflllllksd";
/*
* 书写正则规则
*
* 如果在一个正则表达式中,已经存在了组,在本正则中使用存在的组
* 直接使用\\组号的方式引用。
* 如果不在本正则表达式中引用正则中的组,需要使用$组号
*/
Stringregex = "(.)\\1+";
Stringnew_str = s.replaceAll("(.)\\1+","$1");
System.out.println(new_str);
}
// 将多个#号替换成一个#号
public static void method() {
// 需要被替换的字符串
Strings = "sjk####lfj###sdk#######ljfk####ld##sj";
// 书写正则规则
Stringregex = "#+";
Stringnew_str = s.replaceAll(regex, "#");
System.out.println(new_str);
}
}
需求:从一个字符串中提取指定的内容
“sdjflkskj13234561234djfue1349876543rieje18800008888irtircnvhdslflsdjfl”
正则表达式它在Java中它属于字符串,但是这类字符串数据又具备了其他的功能。Java将正则表达式这类数据又重新封装一个类,使用这个类表示正则表达式这类事物(数据)。
在Java中Pattern这个类表示正则表达式这类事物。
Pattern类没有对外提供公开的构造方法,因此我们不能直接通过new关键字创建Pattern对象。