正则表达式

正则表达式

Java正则表达式是Java语言中用于匹配字符串中字符组合的模式。Java提供了java.util.regex包,其中包含了用于正则表达式操作的主要类:

  1. Pattern
    • 表示正则表达式的编译表示形式。Pattern类是不可变的,所以可以安全地共享。
  2. Matcher
    • 是正则表达式引擎的结果,用于与输入字符串进行匹配。
  3. PatternSyntaxException
    • 表示正则表达式模式中的语法错误。

字符通配符

字符通配符是一种特殊的字符,通常用于文件搜索或字符串匹配操作中,代表一个或多个任意字符。在不同的上下文中,字符通配符可能有不同的表现形式和用途。以下是一些常见的字符通配符及其用法:

  1. 星号(*)
    • 在许多编程语言和操作系统的文件搜索中,星号代表任意数量的任意字符。例如,在文件系统中搜索*.txt会匹配任何以.txt结尾的文件。
  2. 问号(?)
    • 问号代表单个任意字符。例如,在文件系统中搜索?.txt会匹配任何以单个字符后跟.txt结尾的文件,如a.txtb.txt等。
  3. 方括号([ ])
    • 方括号用于定义一个字符集合,匹配方括号内的任意一个字符。例如,[abc].txt会匹配a.txtb.txtc.txt
  4. 范围(a-z、A-Z、0-9)
    • 在方括号内,可以使用范围来表示一系列连续的字符。例如,[a-z]代表任意一个小写字母,[0-9]代表任意一个数字。
  5. 脱字符(^)
    • 当脱字符出现在方括号内的开始位置时,它表示不在方括号内的任何字符。例如,[^abc].txt会匹配不是a.txtb.txtc.txt的任何文件。
  6. 连字符(-)
    • 在方括号内,连字符用于表示一个字符范围。例如,[a-z]表示从az的任意小写字母。
  7. 反斜杠(\)
    • 在正则表达式中,反斜杠用作转义字符,用于转义那些在正则表达式中有特殊意义的字符,或者表示特殊序列。例如,要匹配文字中的星号*,可以使用\*
  8. 点(.)
    • 在某些上下文中,点字符可以作为通配符,代表任意单个字符。但在正则表达式中,点(.)需要被转义(即\.)以表示文字中的点字符,因为未转义的点代表任意单个字符。

次数通配符

次数通配符用于指定正则表达式中前一个字符或组的出现次数。以下是一些常见的次数通配符:

  1. \* (星号):
    • 表示前面的元素可以出现零次或多次。例如,a*可以匹配字符串""(空字符串)或"aaa"。
  2. + (加号):
    • 表示前面的元素至少出现一次或多次。例如,a+可以匹配"a"或"aaa",但不能匹配空字符串。
  3. ? (问号):
    • 表示前面的元素可以出现零次或一次。例如,a?可以匹配"a"或""(空字符串)。
  4. {n}
    • 表示前面的元素恰好出现n次。例如,a{3}可以匹配"aaa"。
  5. {n,}
    • 表示前面的元素至少出现n次,没有上限。例如,a{2,}可以匹配"aa"或"aaa",但不能匹配"a"。
  6. {n,m}
    • 表示前面的元素至少出现n次,最多出现m次。例如,a{2,3}可以匹配"aa"或"aaa",但不能匹配"a"或"aaaa"。
  7. \*? (非贪婪星号):
    • 懒惰版本,尽可能少地匹配字符。例如,在字符串"aaa"中使用(a*)(a*?)都会匹配"aaa",但(a*)会捕获整个字符串,而(a*?)只会捕获一个"a"。
  8. +? (非贪婪加号):
    • 懒惰版本,尽可能少地匹配字符,至少出现一次。
  9. ?? (非贪婪问号):
    • 懒惰版本,尽可能少地匹配字符,只匹配一次或零次。

以下是一些使用次数通配符的正则表达式示例:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexQuantifierExample {
    public static void main(String[] args) {
        // 正则表达式示例
        String regex1 = "a*"; // 匹配任意数量的'a'
        String regex2 = "a+"; // 至少匹配一个'a'
        String regex3 = "a?"; // 匹配零个或一个'a'
        String regex4 = "a{3}"; // 恰好匹配三个'a'
        String regex5 = "a{2,}"; // 至少匹配两个'a'
        String regex6 = "a{2,3}"; // 匹配两个或三个'a'
        String regex7 = "a*?"; // 懒惰的星号,尽可能少地匹配'a'

        // 测试字符串
        String testString = "aaaa";

        // 编译正则表达式并测试匹配
        Pattern pattern1 = Pattern.compile(regex1);
        Pattern pattern2 = Pattern.compile(regex2);
        Pattern pattern3 = Pattern.compile(regex3);
        Pattern pattern4 = Pattern.compile(regex4);
        Pattern pattern5 = Pattern.compile(regex5);
        Pattern pattern6 = Pattern.compile(regex6);
        Pattern pattern7 = Pattern.compile(regex7);

        Matcher matcher1 = pattern1.matcher(testString);
        Matcher matcher2 = pattern2.matcher(testString);
        Matcher matcher3 = pattern3.matcher(testString);
        Matcher matcher4 = pattern4.matcher(testString);
        Matcher matcher5 = pattern5.matcher(testString);
        Matcher matcher6 = pattern6.matcher(testString);
        Matcher matcher7 = pattern7.matcher(testString);

        System.out.println("Regex1 (a*): " + matcher1.matches()); // true
        System.out.println("Regex2 (a+): " + matcher2.matches()); // true
        System.out.println("Regex3 (a?): " + matcher3.matches()); // true
        System.out.println("Regex4 (a{3}): " + matcher4.matches()); // true
        System.out.println("Regex5 (a{2,}): " + matcher5.matches()); // true
        System.out.println("Regex6 (a{2,3}): " + matcher6.matches()); // true
        System.out.println("Regex7 (a*?): " + matcher7.find()); // true, 懒惰匹配,只匹配一个'a'
    }
}

在这个示例中,我们定义了多个正则表达式,并使用它们来匹配一个测试字符串"aaaa"。每个正则表达式都使用了不同的次数通配符来定义匹配规则。然后,我们编译了这些正则表达式,使用Matcher对象来测试它们是否与测试字符串匹配,并打印了结果。

其他通配符

  1. 圆点 . (在正则表达式中):
    • 在正则表达式中,未转义的圆点表示匹配任意单个字符(除了换行符)。
  2. 单引号 ' (在某些脚本语言中):
    • 在某些脚本语言中,如Bash,单引号用于定义字面量字符串,其中的特殊字符不会被解释。
  3. 双引号 " (在某些脚本语言中):
    • 与单引号相对,双引号内的变量和转义字符会被解释。
  4. 波浪线 ~ (在版本控制中):
    • 在Git等版本控制系统中,波浪线用于表示某个提交的父提交。
  5. 美元符号 $ (在正则表达式和变量替换中):
    • 在正则表达式中,$表示字符串的末尾。在某些脚本语言中,如Bash,$用于变量替换。
  6. 反斜杠 \ (在正则表达式和转义序列中):
    • 在正则表达式中,反斜杠用作转义字符,用于转义那些在正则表达式中有特殊意义的字符。
  7. 方括号 [ ] (在正则表达式中):
    • 用于定义字符集,匹配方括号内的任意一个字符。
  8. 圆括号 ( ) (在正则表达式中):
    • 用于分组,可以对正则表达式的部分进行组合,以便应用量词或提取匹配的子字符串。
  9. 垂直线 | (在正则表达式中):
    • 表示逻辑“或”,用于匹配选项中的任意一个。
  10. 脱字符 ^ (在正则表达式和行首标记中):
    • 在正则表达式中,当位于方括号[ ]内时,表示不在方括号内的任何字符;当位于圆括号( )内或行首时,表示字符串的开头。
  11. 花括花 }{ (在大括号扩展中):
    • 在某些脚本语言中,如Bash,花括号用于扩展变量或参数。
  12. 星号 \* (在文件系统搜索中):
    • 在文件系统搜索中,星号通常表示匹配任意数量的任意字符。
  13. 问号 ? (在文件系统搜索中):
    • 在文件系统搜索中,问号通常表示匹配单个任意字符。
  14. 方括号 [!...] (在文件系统搜索中):
    • 在某些系统中,方括号加感叹号表示排除方括号内的字符。
posted @ 2024-08-19 18:57  糊涂图-4060  阅读(50)  评论(0)    收藏  举报