一文搞懂Java正则表达式

开发 前端
详解如何在Java中构建正则表达式,并提供一些示例正则表达式。

1 介绍

如果我们想根据特定的模式表示一组字符串,那么我们应该使用正则表达式。

例如,我们可以编写一个正则表达式来表示所有有效的电子邮件地址,或者我们可以编写一个正则表达式来验证有效的电话号码等。

使用正则表达式的最重要的应用领域是:

  • 开发验证框架,如Hibernate Validator。
  • 开发模式匹配工具或应用程序,如Linux中的Ctrl+F或grap cmd。
  • 开发数字电路
  • 开发翻译器,如汇编器、编译器和解释器等。
  • 开发通信协议TCP/IP、UDP等。

要在Java中使用正则表达式,我们可以利用java.util.regex包,该包包括以下类:

  • Pattern——这个类是一组可以用于定义各种类型模式的正则表达式的编译(定义在搜索中使用的模式)。
  • Matcher——这个对象用于在Java中执行匹配操作,用于在输入字符串中搜索模式。
  • PatternSyntaxException——这个类用于指示正则表达式模式中的语法错误。

这里是一个正则表达式的示例代码片段:

import java.util.regex.*;

public class RegularExpression {

    public static void main(String[] args) {
        int count = 0;
        Pattern pattern = Pattern.compile("ab");
        Matcher matcher = pattern.matcher("abcbcbcababacb");
        while (matcher.find()) {
            ++count;
            System.out.println(matcher.group()+ "...... found at: "+matcher.start());
        }

        System.out.println("The Total number of occurrence is " + count);

    }
}

/****
  Output-
  ab...... found at: 0
  ab...... found at: 7
  ab...... found at: 9
  The Total number of occurrence is 3
****/

2 Pattern

Pattern是一个已编译的正则表达式,即Java中的模式等价物。我们可以使用Pattern类的compile()方法创建一个模式对象。Pattern类的compile()方法的签名如下:

Flags——compile()方法中的标志会改变搜索的方式。以下是其中几个:

  • CASE_INSENSITIVE——在执行搜索时将忽略字母的大小写。
  • UNICODE_CASE——与CASE_INSENSITIVE标志一起使用,它会忽略英语字母以外的字母的大小写。
  • LITERAL——使用时,模式中的特殊字符将不具有任何特殊含义,在执行搜索时只被视为普通字符。
public static Pattern compile(String regex)

以下是Pattern类compile()方法的一个示例:

Pattern pattern = Pattern.compile("ab");

3 Matcher

matcher对象可用于检查目标字符串中的指定模式。使用Pattern类的matcher()方法,我们可以生成一个匹配器对象。Pattern类的matcher()方法具有以下签名:

public Matcher matcher(CharSequence input)

以下是Pattern类matcher()方法的示例:

Matcher matcher = pattern.matcher("abcbcbcababacb");

Matcher类存在于java.util.regex包中。以下是Matcher类一些最重要的方法:

  • boolean find()——这个方法尝试查找下一个匹配项,在找到匹配项时返回true,否则返回false。
  • int start()——这个方法返回匹配项在输入字符串中的起始索引。
  • int end()——这个方法返回匹配项在输入字符串中的结束索引。
  • String group()——这个方法返回匹配的模式。

注意:Pattern和Matcher类存在于java.util.regex包中,从java1.4v开始引入。

4 字符类

  • [abc]——要么是'a'、'b'或'c'
  • [^abc]——除了'a'、'b'和'c'
  • [a-z]——任何从a到z的小写字母符号
  • [A-Z]——任何从A到Z的大写字母符号
  • [a-zA-Z]——任何字母符号
  • [0–9]——任何0到9的数字
  • [a-zA-Z0–9]——任何字母数字符号
  • [^a-zA-Z0–9]——除了字母数字符号(仅限特殊字符)

5 预定义字符类

  • .——除换行符外的任何字符
  • \d——数字(0-9)
  • \D——非数字(0-9)
  • \w——单词字符(a-z、A-Z、0-9、_)
  • \W——非单词字符
  • \s——空格(空格、制表符、换行符)
  • \S——非空格(空格、制表符、换行符)
  • \b——单词边界
  • \B——非单词边界
  • \uxxxx——由十六进制数xxxx指定的Unicode字符

6 量词符

  • *——0次或多次
  • +——1次或多次
  • ?——0次或1次
  • {3}——精确数量3次
  • {3,4}——数字范围(最小值,最大值)

我们可以使用量词符指定要匹配的出现次数。

Pattern类的split()方法

要根据特定的模式拆分目标字符串,我们可以使用Pattern类的split()方法。Pattern类的split()方法具有以下签名:

public String[] split(CharSequence input)

为了方便,我在这里包含了Pattern类split()方法的代码片段:

public class RegularExpression {

    public static void main(String[] args) {
        Pattern pattern = Pattern.compile("\\s");
        String[] splitString = pattern.split("Pattern class is present in java.util.regex");
        for (String text : splitString) {
            System.out.println(text);
        }

    }
}

/***
  Output -
    Pattern
    class
    is
    present
    in
    java.util.regex
***/

在上面的示例中,根据空格(\s)分割了字符串。

String类的split()方法

String类也包含split()方法。字符串类的split()方法用于根据特定模式拆分目标字符串。

public class RegularExpression {

    public static void main(String[] args) {
        String text = "This is example of String class split() method";
        String[] strings = text.split("\\s");
        for (String s : strings) {
            System.out.println(s);
        }
    }
}

/***
Output
  This
  is
  example
  of
  String
  class
  split()
  method
***/

在上面的例子中,字符串是根据空白(\s)来划分的。

注意:Pattern类的split()方法可以接受一个目标字符串作为参数,而String类的split()方法可以接受一个正则表达式作为参数。

7 StringTokenizer

StringTokenizer是专门用于标记化任务的类。Java.util包中有一个StringTokenizer类。

public class StringTokenizerDemo {

    public static void main(String[] args) {
     
        StringTokenizer tokenizer = new StringTokenizer("StringTokenizer class present in java.util package");
        while (tokenizer.hasMoreTokens()) {
            System.out.println(tokenizer.nextToken());

        }
    }
}

/***
  Output -
    StringTokenizer
    class
    present
    in
    java.util
    package
***/

注意:StringTokenizer的默认正则表达式为空格符(\s)。

我们也可以根据需要传递正则表达式,以下是代码片段有助于你更好地理解:

StringTokenizer tokenizer = new StringTokenizer("05-21-2023","-");
while (tokenizer.hasMoreTokens()) {
    System.out.println(tokenizer.nextToken());
}
/***
  Output
    05
    21
    2023
***/

我列了一些常用的编程正则表达式:

图片

责任编辑:武晓燕 来源: Java学研大本营
相关推荐

2020-09-18 06:42:14

正则表达式程序

2009-02-18 09:48:20

正则表达式Java教程

2016-11-10 16:21:22

Java 正则表达式

2018-09-27 15:25:08

正则表达式前端

2020-09-04 09:16:04

Python正则表达式虚拟机

2011-07-11 12:33:30

JAVA

2009-06-08 16:49:05

Java正则表达式group

2023-10-07 08:25:09

Java处理工具正则表达式

2010-03-25 18:25:36

Python正则表达式

2009-09-16 18:19:34

正则表达式组

2021-01-27 11:34:19

Python正则表达式字符串

2017-05-12 10:47:45

Linux正则表达式程序基础

2011-06-02 12:34:16

正则表达式

2019-07-17 15:45:47

正则表达式字符串前端

2022-03-28 06:19:14

正则表达式开发

2021-07-14 23:54:01

正则表达式数据

2009-09-16 17:15:57

正则表达式引擎

2022-01-04 11:35:03

Linux Shel正则表达式Linux

2023-09-13 08:12:45

2009-06-09 09:16:52

Java正则表达式
点赞
收藏

51CTO技术栈公众号