正则表达式-Java正则表达式的应用

正则表达式

字符类

  • Java中用字符串String.matches("正则表达式")来匹配

  • 中括号[ ]里面代表的是单个字符

  • ^取反:

    [^abc]除了abc其它单个字符都匹配(只能匹配单个字符)

  • a-z, -取范围:

    • [a-z]匹配范围a-z之类的单个字符

    • [a-zA-Z]还有一种并集的写法[a-z[A-Z]],实际功能操作无区别

  • &&交集:

    • example1:[a-z && [def]]a到edef的交集
    • example2:[a-z && [^bc]]a到e非b和非c的交集
    • example3:[a-z && [^m-p]]a到e非m到p的交集

预定义字符类

  • .代表任何字符一个.代表任意的一个字符(除了换行符\n)

  • \d代表数字:[0-9]

    • 一般写成String regex = "\\d",还有一个\为转义字符。以下也遵循此项
    • 仅匹配一个字符
  • \D代表非数字:[^0-9]

  • \s代表空白字符:[ \t\n\xOB\f\r]

  • \S代表非空白字符:[^\s]

  • \w代表单词字符:[a-zA-Z_0-9]

  • \W代表非单词字符:[^\w]

数量词

  • X? X,一次或一次也没有

  • X* X,零次或多次

  • X+ X,一次或多次

  • X{n} X,恰好 n 次

  • X{n,} X,至少 n 次

  • X{n,m} X,至少 n 次,但是不超过 m 次

    **注: **X可以是字符或者预定义字符

Java中正则表达式的应用

Java转义的特殊性

在其他语言中,\ 表示:我想要在正则表达式中插入一个普通的(字面上的)反斜杠,请不要给它任何特殊的意义。

在 Java 中,\ 表示:我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。

所以,在其他的语言中(如Perl),一个反斜杠 \ 就足以具有转义的作用,而在 Java 中正则表达式中则需要有两个反斜杠才能被解析为其他语言中的转义作用。也可以简单的理解在 Java 的正则表达式中,两个 \\ 代表其他语言中的一个 \,这也就是为什么表示一位数字的正则表达式是 \\d,而表示一个普通的反斜杠是 \\\\

例如:

public static void main(String[] args) {
    String s = "I.....like......Java";
    String regex = "\\.+";
    String[] arr = s.split(regex);
    for(int i = 0;i < arr.length; i++) {
        System.out.println(arr[i]);
    }
}

运行结果:

I
like
Java

字符串切割排序案例

需求:有一个如下字符串"91 27 46 38 50",编写代码实现输出 “27 38 46 50 91”(转化后为int数组)

import java.util.Arrays;

public class MainTest {
    public static void main(String[] args) {
        String s = "91 27 46 38 50";
        String regex = " ";
        String[] arr = s.split(regex);
        Integer[] arr2int = new Integer[arr.length];
        for(int i = 0; i < arr.length; i++) {
            arr2int[i] = new Integer(arr[i]);
        }
        Arrays.sort(arr2int);
        String afterSort = Arrays.toString(arr2int);
        System.out.println(afterSort);
    }
}

输出结果:

[27, 38, 46, 50, 91]

正则表达式的替换

String s = "zlqhexyz";
        String regex = "[xyz]";
        String s2 = s.replaceAll(regex, "o");
        System.out.println(s2);

输出结果:

olqheooo

正则表达式的分组及其代码演示

正则表达式可以通过" () "来进行分组

如果没有显式为捕获组命名,即没有使用命名捕获组,那么需要按数字顺序来访问所有捕获组。在只有普通捕获组的情况下,捕获组的编号是按照“(”出现的顺序,从左到右,从1开始进行编号的 。

案例演示:

example1:

判断是否为叠词”高高兴兴,快快乐乐“

       String regex = "(.)\\1(.)\\2";
       System.out.println("高高兴兴".matches(regex));
	   System.out.println("快快乐乐".matches(regex));
true
true

example2:

判断是否为”快乐快乐,高兴高兴“

       String regex = "(..)\\1";
       System.out.println("快乐快乐".matches(regex));
	   System.out.println("高兴高兴".matches(regex));
true
true

example3:

        String regex = "(..)\\1\\1";
        System.out.println("快乐快乐快乐".matches(regex));
        System.out.println("高兴高兴".matches(regex));
true
false

example4:

        String regex = "(..)\\1\\1(..)\\2";
        System.out.println("快乐快乐快乐".matches(regex));
        System.out.println("快乐快乐快乐高兴高兴".matches(regex));
false
true

example5:

        String regex = "(.)\\1{3}";
        System.out.println("1234".matches(regex));
        System.out.println("哈哈哈哈".matches(regex));
false
true

对比一下:

String regex = "(.){4}";

和上面有什么不同

String regex = "(.){4}";
        System.out.println("1234".matches(regex));
        System.out.println("哈哈哈哈".matches(regex));
true
true
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dylan、

耕码不易,白嫖可耻

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值