欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-10 11:18:28
...

正则表达式

字符类

  • 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