正则表达式

本文介绍了正则表达式的基本概念、元字符、语法元素以及在Java中的Pattern和Matcher类的使用。详细讲解了字符类、重复限定符、边界匹配和正则表达式的常见应用场景。
摘要由CSDN通过智能技术生成

正则表达式

正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。
简单来说,正则表达式就是一个很牛逼的字符串处理工具。

正则在线工具 : https://c.runoob.com/front-end/854/?optionGlobl=global

正则表达式

正则表达式(Regular Expression)是一种用于处理文本模式匹配和搜索的强大工具。它使用特定的语法格式来定义要匹配的文本模式。

正则表达式的格式由各种字符和元字符组成,以下是常见的正则表达式元素:

1.字面量字符:表示要直接匹配的字符。例如,字母、数字、标点符号等都可以作为字面量字符。

2.元字符:表示具有特殊含义的字符。例如,. 表示匹配任意字符,\d 表示匹配一个数字字符等。

3.字符类:用方括号 [ ] 表示,用于指定一个字符集合。例如,[abc] 表示匹配字符 a、b 或 c 中的任意一个。

4.转义字符:用反斜杠 \ 来取消字符的特殊含义,使其成为字面量字符。例如,. 表示匹配句号字符 .。

5.重复限定符:用于指定某个字符或字符组合的重复次数。例如,* 表示前面的元素可以重复零次或多次,+ 表示至少重复一次,? 表示重复零次或一次。

6.边界匹配:用于指定匹配的位置。例如,^ 表示匹配字符串的开头,$ 表示匹配字符串的结束。

7.分组:用括号 ( ) 将一系列字符组合在一起,形成一个子表达式。可以对子表达式进行分组、捕获和应用修饰符等操作。

8.逻辑操作符:用于将多个表达式组合起来。例如,| 表示或操作,() 可以用于控制优先级。

这只是正则表达式语法的简要介绍,正则表达式还有很多其他的语法元素和特性,用于更复杂的模式匹配和搜索操作。学习和理解正则表达式的语法规则需要一些时间和实践,但一旦掌握,它可以成为处理文本的强大工具。

注意这个边界匹配需要注意用法

比如正则表达式中的 ^ 和 $ 符号是用于表示匹配字符串的开始和结束位置的锚点。

^[0-9]{5,12}$

  • ^ 表示匹配字符串的开始位置。
  • [0-9]{5,12} 表示匹配由 5 到 12 个数字组成的字符串。
  • $ 表示匹配字符串的结束位置。 所以整个正则表达式 ^[0-9]{5,12}$ 匹配的是只包含 5 到 12 个数字的完整字符串。

[0-9]{5,12}

  • [0-9] 表示匹配一个数字。
  • {5,12} 表示匹配前面的元素(这里是一个数字)连续出现 5 到 12 次。 这个正则表达式 - - - [0-9]{5,12} 匹配的是在字符串中连续出现的 5 到 12 个数字序列,而不要求整个字符串完全匹配。
    如果我们有一个目标字符串 “123456789”,使用 ^[0-9]{5,12}$ 的正则表达式只会匹配整个字符串 “123456789”,因为它必须满足从开始到结束的条件。而使用 [0-9]{5,12} 的正则表达式将匹配两个连续出现的数字子序列 “12345” 和 “6789”。

总结一下,^[0-9]{5,12}$ 表示匹配只包含 5 到 12 个数字的完整字符串,而 [0-9]{5,12} 表示匹配连续出现的 5 到 12 个数字子序列。

预定义字符

预定义字符预定义字符
.可以匹配任何字符
\d匹配 0~9 的所有数字
\D匹配非数字
\s匹配所有的空白字符,包括空格、制表符、回车符、换页符、换行符等
\S匹配所有的非空白字符
\w匹配所有的单词字符,包括 0~9 所有数字、26 个英文字母和下画线_
\W匹配所有的非单词字符

正则表达式中的特殊字符

特殊字符说明
$匹配一行的结尾。要匹配 $ 字符本身,请使用$
^匹配一行的开头。要匹配 ^ 字符本身,请使用^
()标记子表达式的开始和结束位置。要匹配这些字符,请使用(和)
[]用于确定中括号表达式的开始和结束位置。要匹配这些字符,请使用[和]
{}用于标记前面子表达式的出现频度。要匹配这些字符,请使用{和}
*指定前面子表达式可以出现零次或多次。要匹配 * 字符本身,请使用*
+指定前面子表达式可以出现一次或多次。要匹配 + 字符本身,请使用+
?指定前面子表达式可以出现零次或一次。要匹配 ?字符本身,请使用?
.匹配除换行符\n之外的任何单字符。要匹配.字符本身,请使用.
\用于转义下一个字符,或指定八进制、十六进制字符。如果需匹配\字符,请用\

正则表达式所支持的合法字符

字符解释
X字符x(x 可代表任何合法的字符)
\0mnn八进制数 0mnn 所表示的字符
\xhh十六进制值 0xhh 所表示的字符
\uhhhh十六进制值 0xhhhh 所表示的 Unicode 字符
\t制表符(“\u0009”)
\n新行(换行)符(‘\u000A’)
\r回车符(‘\u000D’)
\f换页符(‘\u000C’)
\a报警(bell)符(‘\u0007’)
\eEscape 符(‘\u001B’)
\cxx 对应的的控制符。例如,\cM匹配 Ctrl-M。x 值必须为 A~Z 或 a~z 之一。

正则表达式常用类

Pattern类

Pattern 类是 Java 中用于表示正则表达式模式的类。它提供了一组静态方法来编译和匹配正则表达式。

以下是 Pattern 类的一些常用方法:

1.compile(String regex):将给定的正则表达式编译为 Pattern 对象。该方法返回一个 Pattern 实例,可以重复使用来进行匹配操作。

2.matcher(CharSequence input):创建一个 Matcher 对象,用于对指定的输入字符串进行匹配操作。CharSequence 可以是 String、StringBuffer 或 StringBuilder 等类型。

3.matches(String regex, CharSequence input):用给定的正则表达式模式匹配整个输入字符串。返回一个布尔值,表示是否完全匹配。

4.split(CharSequence input):根据给定的正则表达式模式拆分输入字符串,并返回一个数组。

5.replaceFirst(String replacement, CharSequence input):使用给定的替换字符串替换输入字符串中第一个匹配的子序列。

6.replaceAll(String replacement, CharSequence input):使用给定的替换字符串替换输入字符串中所有匹配的子序列。

Matcher

Matcher 类是 Java 中用于执行正则表达式匹配操作的类。它与 Pattern 类一起使用,通过 Pattern.matcher(CharSequence input) 方法创建一个 Matcher 对象,然后可以使用该对象执行匹配操作。

以下是 Matcher 类的一些常用方法:

1.matches():尝试将整个输入序列与模式进行匹配,并返回一个布尔值表示是否完全匹配。

2.lookingAt():尝试将输入序列的开头与模式进行匹配,并返回一个布尔值表示是否部分匹配。

3.find():尝试在输入序列中查找下一个匹配的子序列,并返回一个布尔值表示是否找到匹配。

4.group():返回与上一次匹配操作所得到的匹配子序列。

5.start():返回前一次匹配操作的起始索引。

6.end():返回前一次匹配操作的结束索引。

7.replaceAll(String replacement):将匹配的子序列替换为指定的字符串,并返回替换后的结果。

8.appendReplacement(StringBuffer sb, String replacement):将匹配的子序列替换为指定的字符串,并将结果添加到 StringBuffer 中。

9.appendTail(StringBuffer sb):将剩余的输入添加到 StringBuffer 中。

下面是结合这两个类的代码案例

public class RegexDemo1 {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        //
        Pattern pattern = Pattern.compile("^[0-9]{5,12}$"); //正则的编译对象

        while (true) {
            System.out.println("请输入qq");
            String s1 = in.nextLine();
            Matcher matcher = pattern.matcher(s1);
            System.out.println(matcher.matches()); //全部匹配
//            System.out.println(s1.matches("^[0-9]{5,12}$"));
        }
    }

    @Test
    public void test1() {
        //正则编译对象,只匹配一次可以使用matches方法
        System.out.println(Pattern.matches("^[0-9]{5,12}$", "77546313")); //正则是否全部匹配
        System.out.println(Pattern.matches("^[0-9]{5,12}$", "123456")); //正则是否全部匹配
        System.out.println(Pattern.matches("^[0-9]{5,12}$", "333333")); //正则是否全部匹配

        Pattern pattern = Pattern.compile("^[0-9]{5,12}$");
        pattern.matcher("77546313").matches();
        pattern.matcher("123456").matches();
        pattern.matcher("333333").matches();
    }

    @Test
    public void test2() {
        //全部匹配
        Pattern pattern = Pattern.compile("\\d{5,12}");
        Matcher matcher = pattern.matcher("12345a34343434");
        System.out.println(matcher.matches()); //全部匹配
    }

    @Test
    public void test3() {
        //全部匹配
        Pattern pattern = Pattern.compile("\\d{5,12}");
        Matcher matcher = pattern.matcher("12345a34343434abc9878989");

        while (matcher.find()) {//查找匹配,如果匹配返回ture
            String target = matcher.group();//得到上一次匹配的子序列
            System.out.println(target + "-" + matcher.start() + "-" + matcher.end()); //start得到上一个匹配的索引开始
        }
    }

    @Test
    public void test4() {
        String content =
                "Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的高级程序设计语言。\n"
                        + "Java 可运行于多个平台,如 windows,Mac OS 及其他多种 UNIX 版本的系统。\n"
                        + "本教程通过简单的实例将让大家更好的了解 Java 编程语言。\n"
                        + "移动操作系统 Android 大部分的代码采用 Java 编程语言编程。";
        Pattern pattern = Pattern.compile("([a-zA-Z]+) | (\\d+)");
        Matcher matcher = pattern.matcher(content);

        while (matcher.find()) {
            String target = matcher.group(2); //0:全部的正则捕获组,1:的一个小括号的正则补货组
            System.out.println(target);
        }

    }


    @Test
    public void test6() {
        String content =
                "Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的高级程序设计语言。\n"
                        + "Java 可运行于多个平台,如 windows,Mac OS 及其他多种 UNIX 版本的系统。\n"
                        + "本教程通过简单的实例将让大家更好的了解 Java 编程语言。\n"
                        + "移动操作系统 Android 大部分的代码采用 Java 编程语言编程。";

        //创建一个Pattern对象
        Pattern pattern = Pattern.compile("Java");
        //创建一个匹配对象
        Matcher matcher = pattern.matcher(content);

        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            //将Java替换为java后,将最后匹配到之前的子串都添加到sb对象中
            matcher.appendReplacement(sb, "java");
            System.out.println("sb:" + sb);
            System.out.println("---------分割线-----------");
        }
        //将最后匹配到的子串添加到sb中
        matcher.appendTail(sb);
        System.out.println("sb: " + sb);
    }

}

正则表达式的常见应用

1. 验证字符串是否全是汉字

Pattern pattern=Pattern.compile("^[\u0391-\uffe5]+$");

2. 验证字符串是否是邮编

Pattern pattern=Pattern.compile("^\\d{6}$");

3. 验证字符串是否是QQ号码

Pattern pattern=Pattern.compile("^[1-9]d{4,9}$");

4. 验证字符串是否是手机号码(要求:必须以13,14,15,18开头的11位数)

 Pattern pattern=Pattern.compile("^1[3|4|5|8]\\d{9}$");

5. 验证字符串是否是url

 Pattern pattern=Pattern.compile("^((http|https)://)([\\w-]+\\.)+[\\w-]+(\\/[\\w-?=&/%.#]*)?$");

补充:
Java正则表达式默认是区分字母大小写的,如要实现不区分大小写

  • (?i)abc表示abc都不区分大小写
  • a(?i)bc表示bc不区分大小写
  • a((?i)b)c表示只有b不区分大小写
  • Pattern pattern=Pattern.compile(regStr,Pattern.CASE_INSENSITIVE);
    //当创建Pattern对象时,指定Pattern.CASE_INSENSITIVE,表示匹配不区分字母大小写

细节:Java匹配默认贪婪匹配,即尽可能匹配多的,比如"a{3,4}“,表示匹配aaa或者aaaa,但是优先匹配aaaa,例如原字符串中包括"aaaaaa”,匹配"a{3,4}“时,会找到"aaaa”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值