正则表达式的常用字符

正则表达式的基本使用

(1)先看一下字符类

[]表示一个字符:
[abc]: abc其中的一个字符。
[a-z]: a-z中的任意一个字符。
[0-9]: 0-9中任意一个数字。
[a-zA-Z]: a-z或者A-Z中任意一个字符。
[^def]: 求补集,不是def中的一个字符。
[a-c[e-g]]: 求并集,即a-c或者e-g中的一个字符。
[a-z&&[def]]: 求交集,即def中的一个字符。


(2)开头,结尾匹配

^表示开头,例如:"^abc.*",以“abc”开头的。
$表示结尾,例如:".*xyz$",以“xyz”结尾的。


(3)单个字符的其他表示

. 任意一个字符。
\d 数字:[0-9]
\D 非数字:[^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]

注意:“\小写字母”代表一类字符,“\大写字母”代表相反的字符。
字符串中写“\” 代表 “\”。一个反斜杆表示转义,两个反斜杆代表一个反斜杠。


(4)数量词

X?:X出现0次或1次,?表示是否有一个。
X*:X出现0次或多次,*表示任意个。
X+:X出现1次或多次,+表示至少有一个。
X{n}:X恰好出现n次。
X{n,m}:X出现n-m次,n和m都包括了。


(5)正则表达式的分组:
捕获组通过数从左到右的开口括号计数编号。

例如:表达((A)(B( C)))。
有四个这样的团体:
0 ((A)(B( C)))
1 (A)(B( C))
2 (A)
3 (B( C))
4 ( C)
零组总是代表整个表达式。
$1表示第1组的值。

public class Test_ResetPhoneNum {
    public static void main(String[] args) {
        String phone = "13500001111";
        System.out.println(phone.matches("^(1[3-9])\\d{9}$"));  // true

        String resetPhone = phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
        System.out.println(resetPhone);  // 135****1111
    }
}

例1:高高兴兴,快快乐乐,这样的叠词怎么匹配?
(.)\1(.)\2,\1表示第一组再出现1次,\2表示第二组再出现1次。

注意:(.)\1+,表示第一组至少出现1次。


例2:高兴高兴,快乐快乐,这样的叠词怎么匹配?
(…)\1


例3:将"我…我我…我…我…我我要.要…要…要要…学.学…学…学学.编.编…程…程."
变成:“我要学编程”

String s = “我…我我…我…我…我我要.要…要…要要…学.学…学…学学.编.编…程…程.”;
String s2 = s.replaceAll("\.+", “”);
String s3 = s2.replaceAll("(.)\1+", “$1”);


测试代码:

package patterntest;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

//练习题:
public class Test02 {
    public static void main(String[] args) {
        
        // 取出字符串中的三个手机号。
        String s = "我的第一个手机号是13511112222,第二个手机号是15722223333,第三个手机号是18733334444。";
        Pattern p = Pattern.compile("[1][358][0-9]{9}");  // 获取指定的正则表达式
        Matcher m = p.matcher(s);  // 获取匹配器
        boolean b = m.matches();  // 获取匹配的结果
        System.out.println(b);  // false   因为原文很长,怎么可能全是这几个数字

        while (m.find()) {
            int start = m.start();
            int end = m.end();
            String phone = m.group();
            System.out.println("开始下标:" + start + ",结束下标:" + end);
            System.out.println("手机号:" + phone);
            System.out.println();
        }
    }
}

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值