Java基础篇--正则表达式

目录

常见的元字符如下表

Pattern类

Matcher 类

示例

PatternSyntaxException类

示例


在程序开发过程中,我们会对一些字符串做各种限制,比如我们常见的注册邮箱、手机号等操作,一般都会做限制长度、格式等。而这些做限制的操作就是用正则表达式做到的。所谓的正则表达式就是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串。其实就是一种规则。

正则表达式由普通字符(例如字符a-z)和特殊字符(元字符)组成的文字模式,所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。

常见的元字符如下表

元字符

功能描述

\

转义字符,例如"\n"匹配"\n"

^

正则表达式的开头标志

$

正则表达式的结尾标志

*

匹配零次或多次

+

匹配一次或多次

?

匹配一次或零次

.

匹配任意字符

{n}

匹配n

{n,}

至少匹配n

{n,m}

n<=m,最少匹配n次,最多匹配m

x|y|

匹配xy

[xyz]

字符集合。匹配所包含的任意一个字符

[a-z]

匹配小写字母a到z中的任意一个字符。

[A-Z]

匹配大写字母A到Z中的任意一个字符。

元字符

功能描述

[a-zA-Z]

匹配小写任意字母中的任意一个字符。

[A-z]

另一种写法,匹配小写任意字母中的任意一个字符。

\d

数字:[0-9]

\D

非数字: [^0-9]

\s

空白字符:[ \t\n\x0B\f\r]

\S

非空白字符:[^\s]

\w

单词字符:[a-zA-Z_0-9]

\b

单词边界

\B

非单词边界

\A

输入的开头

\G

上一个匹配的结尾

\Z

输入的结尾,仅用于最后的结束符(如果有的话)

\z

输入的结尾

\b

单词边界

Java 的正则表达式与 Perl 的语法非常相似。在 Java 中,使用 java.util.regex 包来处理正则表达式,主要涉及三个类:Pattern、Matcher 和 PatternSyntaxException。

  1. Pattern 类是正则表达式的编译表示,它没有公共构造方法。要创建一个 Pattern 对象,需要调用其公共静态编译方法,该方法接受一个正则表达式作为参数。
  2. Matcher 类是用于对输入字符串进行解释和匹配操作的引擎,它也没有公共构造方法。可以通过调用 Pattern 对象的 matcher 方法获得一个 Matcher 对象,然后可以使用该对象进行字符串匹配操作。
  3. PatternSyntaxException类是一个非强制异常类,用于表示在正则表达式模式中的语法错误。

Pattern类

Pattern 类是 Java 中用于表示正则表达式的编译表示的类。它提供了一组方法和功能,用于创建、匹配和操作正则表达式。

要使用 Pattern 类,需要先调用其静态方法 compile 来编译一个正则表达式,并将其转化为一个 Pattern 对象。下面是一些常用的方法:

  1. compile(String regex):静态方法,将给定的正则表达式编译成一个 Pattern 对象。
  2. Matcher matcher(CharSequence input):返回一个新的 Matcher 对象,用于匹配输入字符串。
  3. pattern():返回当前 Pattern 对象所表示的正则表达式。
  4. split(CharSequence input):根据当前的正则表达式,将输入字符串拆分为多个字符串数组。
  5. Static boolean matches(String regex, CharSequence input):尝试将整个输入序列与正则表达式进行匹配,返回一个布尔值表示匹配结果是否成功。

除了以上方法,Pattern 类还提供了很多其他用于正则表达式匹配和替换的方法。

Matcher 类

Matcher 类是 Java 中用于对字符串进行正则表达式匹配操作的类。它是 Pattern 类的实例化对象,并提供了一系列方法和功能来执行匹配操作。

要使用 Matcher 类,首先需要创建一个 Matcher 对象。可以通过调用 Pattern 类的 matcher(CharSequence input) 方法来创建 Matcher 对象,将要匹配的字符序列作为参数传入。

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

  1. boolean matches():尝试将整个输入序列与正则表达式进行匹配,返回一个布尔值表示匹配结果是否成功。
  2. boolean lookingAt():对前面的字符串进行匹配,只有匹配到的字符串在最前面才返回true
  3. boolean find():在输入序列中查找下一个匹配项,返回一个布尔值表示是否找到匹配项。
  4. String group():返回与上一次匹配操作所匹配的子序列。
  5. int start():返回最后一次匹配的起始索引位置。
  6. int end():返回上一次匹配操作的结束索引的后一位置。
  7. replaceAll(String replacement):将输入字符串中所有匹配正则表达式的部分替换为指定的字符串。
  8. replaceFirst(String replacement):将输入字符串中第一个匹配正则表达式的部分替换为指定的字符串。
  9. reset(CharSequence input):重置 Matcher 对象,指定新的输入序列进行匹配。

示例

以下一个示例,展示如何使用 PatternMatcher 类来进行正则表达式匹配和操作:

import java.util.regex.*;

public class myclass {
    public static void main(String[] args) {
        String input = "请联系我邮箱: [email protected] 或者访问我的网站 https://www.example.com 获取更多信息。";

        // 定义正则表达式
        String emailPatternString = "\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}\\b";
        String urlPatternString = "https?://[\\w.-]+\\.[A-Za-z]{2,}";

        // 创建 Pattern 对象
        Pattern emailPattern = Pattern.compile(emailPatternString);
        Pattern urlPattern = Pattern.compile(urlPatternString);

        // 创建 Matcher 对象
        Matcher emailMatcher = emailPattern.matcher(input);
        Matcher urlMatcher = urlPattern.matcher(input);

        // 查找并输出第一个匹配的邮箱地址
        if (emailMatcher.find()) {
            String matchedEmail = emailMatcher.group();
            System.out.println("匹配到的邮箱地址: " + matchedEmail);
        }

        // 判断输入中是否包含 URL
        boolean containsUrl = urlMatcher.find();
        System.out.println("输入中是否包含 URL: " + containsUrl);

        // 循环查找并输出所有匹配的 URL
        int count = 0;
        while (urlMatcher.find()) {
            count++;
            String matchedUrl = urlMatcher.group();
            System.out.println("匹配到的 URL " + count + ": " + matchedUrl);
        }

        // 替换邮箱地址和网址
        String modifiedInput = emailMatcher.replaceAll("[email protected]");
        String modifiedInput1 = urlMatcher.replaceAll("https://www.abc.com");

        System.out.println("------------------");
        System.out.println("修改后的输入: " + modifiedInput);
        System.out.println("修改后的输入: " + modifiedInput1);
    }
}

运行结果:

匹配到的邮箱地址: [email protected]
输入中是否包含 URL: true
------------------
修改后的输入: 请联系我邮箱: [email protected] 或者访问我的网站 https://www.example.com 获取更多信息。
修改后的输入: 请联系我邮箱: [email protected] 或者访问我的网站 https://www.abc.com 获取更多信息。

PatternSyntaxException类

PatternSyntaxException 是 Java 中的一个异常类,用于表示在解析正则表达式时发现的语法错误。

该类是在 java.util.regex 包中定义的,并扩展自 RuntimeException 类。它提供了有关正则表达式语法错误的详细信息,以帮助开发人员调试并修复问题。

PatternSyntaxException 类具有以下几个重要的属性和方法:

  1. String getDescription():获取关于语法错误的描述信息。
  2. int getIndex():获取出现语法错误的位置索引。
  3. String getMessage():获取包含描述和索引的完整错误消息。
  4. String getPattern():获取引发语法错误的正则表达式模式。
  5. String getMessage(Locale locale):以指定的本地化语言获取错误消息。

当使用 Pattern 类的 compile() 或其他相关方法编译或解析正则表达式时,如果发现语法错误,则会抛出 PatternSyntaxException 异常。

示例

下面是一个示例代码,展示了如何使用 PatternSyntaxException 异常类处理异常情况:

import java.util.regex.*;

public class myclass {
    public static void main(String[] args) {
        String invalidPattern = "*abc";

        try {
            Pattern.compile(invalidPattern);//当*abc妀为^abc执行
        } catch (PatternSyntaxException e) {
            System.out.println("正则表达式语法错误: " + e.getDescription());
            System.out.println("错误位置索引: " + e.getIndex());
            System.out.println("错误消息: " + e.getMessage());
            System.out.println("错误模式: " + e.getPattern());
        }
    }
}

在上述示例中,我们尝试编译一个包含语法错误的正则表达式 "*abc"。由于存在错误的模式,将抛出 PatternSyntaxException 异常。我们通过捕获异常并打印相关信息来处理这种情况。

正则表达式语法错误: Dangling meta character '*'
错误位置索引: 0
错误消息: Dangling meta character '*' near index 0
*abc
^
错误模式: *abc

你可能感兴趣的:(Java基础篇,正则表达式,java)