编程小龙的博客哟

Java正则表达式笔记

正则表达式

1.概念

正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表通常被用来检索、替换那些符合某个模式(规则)的文本。

  • 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
  • 给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
    • 1.给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);
    • 2.可以通过正则表达式,从字符串中获取我们想要的特定部分。(爬虫应用)
  • 相关类:

java.lang.String

java.util.regex.Pattern

java.util.regex.Matcher

2.正则表达式(常见的规则)

  • 两个特殊的符号'^'和'$'。他们的作用是分别指出一个字符串的开始和结束。例子如下:
//两个特殊的符号'^'和'$'。他们的作用是分别指出一个字符串的开始和结束
"^The":表示所有以"The"开始的字符串("There","The cat"等);
"of despair$":表示所以以"of despair"结尾的字符串;
"^abc$":表示开始和结尾都是"abc"的字符串——呵呵,只有"abc"自己了;
"notice":表示任何包含"notice"的字符串。
// * ? +来表示次数
"ab*":表示一个字符串有一个a后面跟着零个或若干个b。("a", "ab", "abbb",……);
"ab+":表示一个字符串有一个a后面跟着至少一个b或者更多;
"ab?":表示一个字符串有一个a后面跟着零个或者一个b;
"a?b+$":表示在字符串的末尾有零个或一个a跟着一个或几个b。
   
// {}指定范围
"ab{2}":表示一个字符串有一个a跟着2个b("abb");
"ab{2,}":表示一个字符串有一个a跟着至少2个b;
"ab{3,5}":表示一个字符串有一个a跟着3到5个b。
 
// . 可以代替任何字符  
"a.[0-9]":表示一个字符串有一个"a"后面跟着一个任意字符和一个数字;
"^.{3}$":表示有任意三个字符的字符串(长度为3个字符);
方括号表示某些字符允许在一个字符串中的某一特定位置出现:
"[ab]":表示一个字符串有一个"a"或"b"(相当于"a¦b");
"[a-d]":表示一个字符串包含小写的'a'到'd'中的一个(相当于"a¦b¦c¦d"或者"[abcd]");
"^[a-zA-Z]":表示一个以字母开头的字符串;
"[0-9]%":表示一个百分号前有一位的数字;
",[a-zA-Z0-9]$":表示一个字符串以一个逗号后面跟着一个字母或数字结束。
 可以在方括号里用'^'表示不希望出现的字符,'^'应在方括号里的第一位。
(如:"%[^a-zA-Z]%"表示两个百分号中不应该出现字母)。为了逐字表达,你必须在"^.$()|*+?{\"这些字符前加上转移字符'\'。
字符类 
[abc] ----   a、b 或 c(简单类) (某一位上只能是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] 

边界匹配器 
^  ---- 行的开头    
$  ---- 行的结尾       
\b  ---- 单词边界      

\B  ---- 非单词边界 
\A ---- 输入的开头 
\G ---- 上一个匹配的结尾 
\Z ---- 输入的结尾,仅用于最后的结束符(如果有的话) 
\z ---- 输入的结尾 

Greedy 数量词 
X?  ---- X,一次或一次也没有   (举例演示)
X*  ---- X,零次或多次 
X+  ---- X,一次或多次 
X{n} ---- X,恰好 n 次 
X{n,} ---- X,至少 n 次 
X{n,m} ---- X,至少 n 次,但是不超过 m 次

3.常用操作

//1、匹配其实使用的就是String类中的matches()方法
"15115282455".matches("1[3-9]\\d{9}")
//2、切割其实使用的就是String类中的split()方法
System.out.println(Arrays.toString("lzp.is.666".split("\\.")));
System.out.println(Arrays.toString("lzp  is 666".split(" +")));
System.out.println(Arrays.toString("zhangsantttxiaowangqqqlaowangzzz".split("(.)\\1+")));    //[zhangsan, xiaowang, laowang] 重复字符出现多个时分为一组看次数来分割
//3、替换其实使用的就是String类中的replaceAll()方法
System.out.println("zhangsantttxiaowangqqqlaowangzzz".replaceAll("(.)\\1+","$1")); //zhangsantxiaowangqlaowangz  将字符串中重复的多个字符用一个字符替换

4.案例

4.1匹配手机号

String regex = "1[3-9][0-9]{9}";
String regex = "1[3-9]\\d{9}";
System.out.println("15115282455".matches(regex));

4.2匹配三个字母组成的单词

public static void main(String[] args) throws IOException {
    //获取三个字母组成的单词
    String str = "da jia hao,ming tian bu fang jia";
    //String regex = "[a-z]{3}";
    String regex = "\\b[a-z]{3}\\b";//  单词边界 \\b

    //1、将正则规则进行对象的封装
    Pattern p = Pattern.compile(regex);
    //2、通过正则对象获取匹配器对象
    Matcher m = p.matcher(str);
    //3、使用Matcher对象的方法对字符串进行操作。
    // 既然要获取三个字母组成的单词
    // 查找find();
    //    	m.find();
    //    	System.err.println(m.group());//获取匹配的子序列
    System.out.println(str);
    while(m.find()){
        System.out.println(m.group());//获取匹配的子序列
        System.out.println(m.start()+" : "+m.end());
    }
}

4.3匹配必须包含字母、数字

username.matches("[^a-z]+|[^A-Z]+|[^0-9]+")   //如果不包含大写、小写、数字中的任何一个则为true

4.4匹配身份证(自制)

idCard.matches("\\d{6}\\d{4}(([0][1-9])|([1][0-2]))(([0][1-9])|([1][0-9])|([2][0-9])|([3][0-1]))[0-9]{3}[xX0-9]")   //没考虑闰年和年份
posted @ 2020-07-18 14:38  编程小龙  阅读(193)  评论(0)    收藏  举报

(づ ̄3 ̄)づ╭❤~