正则表达式

一,正则表达式语法

1.点号

点号(.)可以匹配除"\n"之外的任何单个字符.例如,正则表达式"t.n"可匹配"tan","ten",'tcn',"t=n","t n"等.

2.中括号
可以在中括号([])内指定需要匹配的若干字符,表示仅使用这些字符参与匹配。例如,正则表达式"t[abcd]n"只匹配"tan"、"tbn"、"ten"、"tdn"。中括号还有一些特殊写法,用于匹配某一范围内的字符,例如"[a-z]"匹配一个小写字母,‘‘[a−zA−Z]′"匹配一个字母,"[0-9]"匹配一个数字字符,"[a-z0-9]"匹配一个小写字母或一个数字字符。
3.竖线
竖线(|)可以匹配其左侧或右侧的符号。例如,正则表达式"t(a|e|i|io)n"除了"tan"。"ten"和"tin"外,还可以匹配"tion"。使用竖线时,必须使用小括号将可以匹配的字符括起来,小括号用来标记正则表达式中的组(group)。
4.^符号
^符号可以匹配一行的开始。例如,正则表达式"^Spring.*"匹配"Spring MVC",而不匹配”a Spring MVC"。若^符号在中括号内,则表示不需要参与匹配的字符。例如,正则表达式"[a-z&&[^bc]]"表示匹配除b 和c之外的小写字母,等价于"[ad-z]";正则表达式"[a-z&&[^h-n]]"表示匹配除h 到n之外的小写字母,等价于"[a-go-z]";正则表达式"[^b][a-z]+"表示首个字符不能是b且后跟至少一个小写字母。
5.美元符号
美元符号($)可以匹配一行的结束。例如,正则表达式".*App$"中的$表示匹配以App结尾的字符串,可以匹配"Android App",而不匹配"iOS Apps"和"App."。
6.反斜线
反斜线(\)表示其后的字符是普通字符而非元字符。例如,正则表达式"\$"用来匹配$字符而非结束,"\."用来匹配"."字符而非任一字符。

7.匹配次数元字符

匹配次数元字符用来确定其左侧符号的数显次数.

常用的匹配次数元字符
元字符含义
X*匹配X出现零次或多次,如Y,YXXXY
X+匹配X出现一次或多次,如YXY,YXX
X?匹配X出现零次或一次,如Y,YXY
X{n}匹配X出现恰好n次
X{n,}匹配X出现至少n次
X{n,m}n<=m,匹配X出现至少n次,最多m次

 8.其他常用符号

元字符含义
\d数字,相当于[0-9]
\D非数字,相当于[^0-9]
\s空白符,相当于[\t\n\x0B\f\r]
\S非空白符,相当于[^\s]
\w单词字符,相当于[a-zA-Z_0-9]
\b单词边界
\B非单词边界
\A输入的开头
\G上一个匹配的结尾
正则表达式描述

this is text

匹配字符串 "this is text"

this\s+is\s+text

注意字符串中的 \s+

匹配单词 "this" 后面的 \s+ 可以匹配多个空格,之后匹配 is 字符串,再之后 \s+ 匹配多个空格然后再跟上 text 字符串。

可以匹配这个实例:this is text

^\d+(\.\d+)?

^ 定义了以什么开始

\d+ 匹配一个或多个数字

? 设置括号内的选项是可选的

\. 匹配 "."

可以匹配的实例:"5", "1.5" 和 "2.21"。

二,java.util.regex 包

java.util.regex 包是 Java 标准库中用于支持正则表达式操作的包。

 java.util.regex 包主要包括以下三个类:

  • Pattern 类:

    pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。

  • Matcher 类:

    Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。

  • PatternSyntaxException:

    PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。

以下实例中使用了正则表达式 .*runoob.* 用于查找字符串中是否包了 runoob 子串:

import java .util.regex.*;
class Main{
    public static void main(String[] args) {
        String content="I am noob from runoob.com";
        String pattern=".*runoob.*";
        boolean isMatch=Pattern.matches(pattern,content);
        System.out.println("字符串中是否包含了'runoob'子字符串?"+isMatch);
    }
}

1.Pattern类与Matcher类

(1)Pattern类

Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式.Pattern类的构造方法是私有的,不可以直接创建正则表达式,为此,Pattern类提供了一个静态的compile()方法,通过调用compile()方法可以创建一个正则表达式.

Pattern p=Pattern.compile("\\w+");
Pattern类的常用方法
方法声明功能描述
static Pattern compile(String re)将正则表达式编译为模式
Matcher matcher(CharSequence input)根据模式为字符串input创建匹配器.String类实现了CharSequence接口,CharSequence接口可视为String
Static boolean matches(String regex,CharSequence input)判断字符串input是否匹配正则表达式regex.该方法适用于只进行一次匹配的情况
String pattern()返回模式使用的正则表达式
String[] spil(CharSequence input)根据模式将字符串input分割为字符串数组
String[] spil(CharSequence input,int limit)根据模式将字符串input分割为字符串数组,同时指定子串的最大个数为limit
import java .util.regex.*;
class Main{
    public static void main(String[] args) {
        Pattern p1=Pattern.compile("a*b");
        Matcher m1=p1.matcher("aaaaab");
        Matcher m2=p1.matcher("aaabbb");
        System.out.println(m1.matches());
        System.out.println(m2.matches());
        Pattern p2=Pattern.compile("[/]+");
        String[] str=p2.split("zhaangsan//lisi//wangwu//zhaoliu//xiaoqi");
        for(String s:str){
            System.out.print(s+"\t");
        }
    }
}

 (2)Matcher类

Matcher类用于验证Pattern类定义的模式与字符串是否匹配,因此Matcher实例也称为匹配器.Matcher类的构造方法也是私有的,不能直接创建Matcher实例,只能通过Pattern.matcher()方法获取该类的实例,多个Matcher对象可以使用同一Pattern对象.

方法声明功能描述
Pattern pattern()返回匹配器的模式
Matcher usePattern(Pattern p)使用模式为 p的匹配器
 
Matcher reset()重设匹配器到初始状态
Matcher reset(CharSequence input)重设匹配器到初始状态,并以 input为目标字符串
boolean find()在目标字符串中查找下一个匹配字符串,若找到则返回true
int start()求正则表达式匹配的字符串在整个字符串中第一次出现的索引
int end()求正则表达式匹配的字符串在整个字符串中最后一次出现的索引
String group()返回匹配的子串
String group(int i)返回上一次匹配的子串中与第i组匹配的子串。正则表达式中以 一对小括号括起来的部分称为组
boolean matcher()对整个字符串进行匹配,只有整个字符串都匹配才返回true
boolean lookingAt()从目标字符串的第一个字符开始匹配,若匹配成功则返回 true
String replaceAll(String s)将目标字符串中与模式匹配的全部子串替换为s并返回替换后的 字符串
String replaceFirst(String s)将目标字符串中与模式匹配的首个子串替换为 s 并返回替换后的 字符串

import java .util.regex.*;
class Main{
    public static void main(String[] args) {
        Pattern p=Pattern.compile("\\d+");
        Matcher m=p.matcher("22bb23");
        System.out.println("字符串是否匹配:"+m.matches());
        Matcher m2=p.matcher("2223");
        System.out.println("字符串2223与模式p是否匹配:"+m2.matches());
        System.out.println("字符串22bb23与模式p的匹配结果:"+m.lookingAt());
        Matcher m3=p.matcher("aa2223");
        System.out.println("字符串aa2223与模式p的匹配结果:"+m3.lookingAt());
        System.out.println("字符串22bb23与模式p是否存在下一个匹配结果:"+m.find());
        System.out.println("字符串aa2223与模式p是否存在下一个匹配结果:"+m3.find());
        Matcher m4=p.matcher("aabb");
        System.out.println("字符串aabb与模式p是否存在下一个匹配结果:"+m4.find());
        Matcher m1=p.matcher("aaa2223bb");
        m1.find();
        System.out.println("模式p与字符串aaa2223bb第一次匹配的索引:"+m1.start());
        System.out.println("模式p与字符串aaa2223bb最后一次匹配的索引:"+m1.end());
        System.out.println("模式p与字符串aaa2223bb匹配的子字符串:"+m1.group());
        Pattern p2=Pattern.compile("[/]+");
        Matcher m5=p2.matcher("张三//李四//王五//小三");
        System.out.println("将字符串张三//李四//王五//小三中的/全部替换为|:"+m5.replaceAll("|"));
        System.out.println("将字符串张三//李四//王五//小三中的首个/替换为|:"+m5.replaceFirst("|"));
    }
}

 2.String类对正则表达式的支持

String类支持正则表达式操作的方法
方法声明功能描述
boolean matches(String regex)匹配字符串regex
String greplaceAll(String regex,String replacement)使用字符串replacement替换regex
String[] spilt(String regex)拆分字符串regex
import java .util.regex.*;
class Main{
    public static void main(String[] args) {
        String str="A1B22DDS23DSJ9D".replaceAll("\\d+","_");
        System.out.println("字符串替换后为:"+str);
        boolean te="321111asl".matches("\\d+");
        System.out.println("字符串是否匹配:"+te);
        String[] s="SSs25sd55sd2ss23s2652sd".split("\\d+");
        System.out.println("字符串拆分后为:");
        for(String s1:s){
            System.out.print(s1+"\t");
        }
    }
}
/*
字符串替换后为:A_B_DDS_DSJ_D
字符串是否匹配:false
字符串拆分后为:
SSs	sd	sd	ss	s	sd	
*/

  • 22
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值