正则表达式
Java正则表达式是Java语言中用于匹配字符串中字符组合的模式。Java提供了java.util.regex
包,其中包含了用于正则表达式操作的主要类:
- Pattern:
- 表示正则表达式的编译表示形式。
Pattern
类是不可变的,所以可以安全地共享。
- 表示正则表达式的编译表示形式。
- Matcher:
- 是正则表达式引擎的结果,用于与输入字符串进行匹配。
- PatternSyntaxException:
- 表示正则表达式模式中的语法错误。
字符通配符
字符通配符是一种特殊的字符,通常用于文件搜索或字符串匹配操作中,代表一个或多个任意字符。在不同的上下文中,字符通配符可能有不同的表现形式和用途。以下是一些常见的字符通配符及其用法:
- 星号(*):
- 在许多编程语言和操作系统的文件搜索中,星号代表任意数量的任意字符。例如,在文件系统中搜索
*.txt
会匹配任何以.txt
结尾的文件。
- 在许多编程语言和操作系统的文件搜索中,星号代表任意数量的任意字符。例如,在文件系统中搜索
- 问号(?):
- 问号代表单个任意字符。例如,在文件系统中搜索
?.txt
会匹配任何以单个字符后跟.txt
结尾的文件,如a.txt
、b.txt
等。
- 问号代表单个任意字符。例如,在文件系统中搜索
- 方括号([ ]):
- 方括号用于定义一个字符集合,匹配方括号内的任意一个字符。例如,
[abc].txt
会匹配a.txt
、b.txt
或c.txt
。
- 方括号用于定义一个字符集合,匹配方括号内的任意一个字符。例如,
- 范围(a-z、A-Z、0-9):
- 在方括号内,可以使用范围来表示一系列连续的字符。例如,
[a-z]
代表任意一个小写字母,[0-9]
代表任意一个数字。
- 在方括号内,可以使用范围来表示一系列连续的字符。例如,
- 脱字符(^):
- 当脱字符出现在方括号内的开始位置时,它表示不在方括号内的任何字符。例如,
[^abc].txt
会匹配不是a.txt
、b.txt
或c.txt
的任何文件。
- 当脱字符出现在方括号内的开始位置时,它表示不在方括号内的任何字符。例如,
- 连字符(-):
- 在方括号内,连字符用于表示一个字符范围。例如,
[a-z]
表示从a
到z
的任意小写字母。
- 在方括号内,连字符用于表示一个字符范围。例如,
- 反斜杠(\):
- 在正则表达式中,反斜杠用作转义字符,用于转义那些在正则表达式中有特殊意义的字符,或者表示特殊序列。例如,要匹配文字中的星号
*
,可以使用\*
。
- 在正则表达式中,反斜杠用作转义字符,用于转义那些在正则表达式中有特殊意义的字符,或者表示特殊序列。例如,要匹配文字中的星号
- 点(.):
- 在某些上下文中,点字符可以作为通配符,代表任意单个字符。但在正则表达式中,点(
.
)需要被转义(即\.
)以表示文字中的点字符,因为未转义的点代表任意单个字符。
- 在某些上下文中,点字符可以作为通配符,代表任意单个字符。但在正则表达式中,点(
次数通配符
次数通配符用于指定正则表达式中前一个字符或组的出现次数。以下是一些常见的次数通配符:
\*
(星号):- 表示前面的元素可以出现零次或多次。例如,
a*
可以匹配字符串""(空字符串)或"aaa"。
- 表示前面的元素可以出现零次或多次。例如,
+
(加号):- 表示前面的元素至少出现一次或多次。例如,
a+
可以匹配"a"或"aaa",但不能匹配空字符串。
- 表示前面的元素至少出现一次或多次。例如,
?
(问号):- 表示前面的元素可以出现零次或一次。例如,
a?
可以匹配"a"或""(空字符串)。
- 表示前面的元素可以出现零次或一次。例如,
{n}
:- 表示前面的元素恰好出现
n
次。例如,a{3}
可以匹配"aaa"。
- 表示前面的元素恰好出现
{n,}
:- 表示前面的元素至少出现
n
次,没有上限。例如,a{2,}
可以匹配"aa"或"aaa",但不能匹配"a"。
- 表示前面的元素至少出现
{n,m}
:- 表示前面的元素至少出现
n
次,最多出现m
次。例如,a{2,3}
可以匹配"aa"或"aaa",但不能匹配"a"或"aaaa"。
- 表示前面的元素至少出现
\*?
(非贪婪星号):- 懒惰版本,尽可能少地匹配字符。例如,在字符串"aaa"中使用
(a*)
和(a*?)
都会匹配"aaa",但(a*)
会捕获整个字符串,而(a*?)
只会捕获一个"a"。
- 懒惰版本,尽可能少地匹配字符。例如,在字符串"aaa"中使用
+?
(非贪婪加号):- 懒惰版本,尽可能少地匹配字符,至少出现一次。
??
(非贪婪问号):- 懒惰版本,尽可能少地匹配字符,只匹配一次或零次。
以下是一些使用次数通配符的正则表达式示例:
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
对象来测试它们是否与测试字符串匹配,并打印了结果。
其他通配符
- 圆点
.
(在正则表达式中):- 在正则表达式中,未转义的圆点表示匹配任意单个字符(除了换行符)。
- 单引号
'
(在某些脚本语言中):- 在某些脚本语言中,如Bash,单引号用于定义字面量字符串,其中的特殊字符不会被解释。
- 双引号
"
(在某些脚本语言中):- 与单引号相对,双引号内的变量和转义字符会被解释。
- 波浪线
~
(在版本控制中):- 在Git等版本控制系统中,波浪线用于表示某个提交的父提交。
- 美元符号
$
(在正则表达式和变量替换中):- 在正则表达式中,
$
表示字符串的末尾。在某些脚本语言中,如Bash,$
用于变量替换。
- 在正则表达式中,
- 反斜杠
\
(在正则表达式和转义序列中):- 在正则表达式中,反斜杠用作转义字符,用于转义那些在正则表达式中有特殊意义的字符。
- 方括号
[ ]
(在正则表达式中):- 用于定义字符集,匹配方括号内的任意一个字符。
- 圆括号
( )
(在正则表达式中):- 用于分组,可以对正则表达式的部分进行组合,以便应用量词或提取匹配的子字符串。
- 垂直线
|
(在正则表达式中):- 表示逻辑“或”,用于匹配选项中的任意一个。
- 脱字符
^
(在正则表达式和行首标记中):- 在正则表达式中,当位于方括号
[ ]
内时,表示不在方括号内的任何字符;当位于圆括号( )
内或行首时,表示字符串的开头。
- 在正则表达式中,当位于方括号
- 花括花
}
和{
(在大括号扩展中):- 在某些脚本语言中,如Bash,花括号用于扩展变量或参数。
- 星号
\*
(在文件系统搜索中):- 在文件系统搜索中,星号通常表示匹配任意数量的任意字符。
- 问号
?
(在文件系统搜索中):- 在文件系统搜索中,问号通常表示匹配单个任意字符。
- 方括号
[!...]
(在文件系统搜索中):- 在某些系统中,方括号加感叹号表示排除方括号内的字符。