Java Regex - 快速指南
Java Regex - Overview
Java提供了java.util.regex包,用于与正则表达式进行模式匹配。 Java正则表达式与Perl编程语言非常相似,非常容易学习。
正则表达式是一种特殊的字符序列,可帮助您使用模式中保存的专用语法来匹配或查找其他字符串或字符串集。 它们可用于搜索,编辑或操作文本和数据。
java.util.regex包主要由以下三个类组成 -
Pattern Class - 模式对象是正则表达式的编译表示。 Pattern类不提供公共构造函数。 要创建模式,必须首先调用其公共静态compile()方法之一,然后返回Pattern对象。 这些方法接受正则表达式作为第一个参数。
Matcher Class - Matcher对象是解释模式并对输入字符串执行匹配操作的引擎。 与Pattern类一样,Matcher没有定义公共构造函数。 通过在Pattern对象上调用matcher()方法获取Matcher对象。
PatternSyntaxException - PatternSyntaxException对象是未经检查的异常,指示正则表达式模式中的语法错误。
Java Regex - Capturing Groups
捕获组是将多个字符视为一个单元的一种方法。 它们是通过将要分组的字符放在一组括号中来创建的。 例如,正则表达式(dog)创建包含字母“d”,“o”和“g”的单个组。
捕获组通过从左到右计算它们的左括号来编号。 在表达式((A)(B(C)))中,例如,有四个这样的组 -
- ((A)(B(C)))
- (A)
- (B(C))
- (C)
要查找表达式中存在多少个组,请在匹配器对象上调用groupCount方法。 groupCount方法返回一个int显示匹配器模式中存在的捕获组数。
还有一个特殊组,即组0,它始终代表整个表达式。 该组未包含在groupCount报告的总数中。
例子 (Example)
以下示例说明如何从给定的字母数字字符串中查找数字字符串 -
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches {
public static void main( String args[] ) {
// String to be scanned to find the pattern.
String line = "This order was placed for QT3000! OK?";
String pattern = "(.*)(\\d+)(.*)";
// Create a Pattern object
Pattern r = Pattern.compile(pattern);
// Now create matcher object.
Matcher m = r.matcher(line);
if (m.find( )) {
System.out.println("Found value: " + m.group(0) );
System.out.println("Found value: " + m.group(1) );
System.out.println("Found value: " + m.group(2) );
} else {
System.out.println("NO MATCH");
}
}
}
这将产生以下结果 -
输出 (Output)
Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT300
Found value: 0
Java Regex - MatchResult Interface
介绍 (Introduction)
java.util.regex.MatchResult接口表示匹配操作的结果。 此接口包含用于确定与正则表达式匹配的结果的查询方法。 可以看到匹配边界,组和组边界,但不能通过MatchResult进行修改。
接口声明
以下是java.util.regex.MatchResult接口的声明 -
public interface MatchResult
接口方法 (Interface methods)
Sr.No | 方法和描述 |
---|---|
1 | int end() 返回最后一个字符匹配后的偏移量。 |
2 | int end(int group) 返回在此匹配期间由给定组捕获的子序列的最后一个字符之后的偏移量。 |
3 | String group() 返回上一个匹配项匹配的输入子序列。 |
4 | String group(int group) 返回上一个匹配操作期间给定组捕获的输入子序列。 |
5 | int groupCount() 返回此匹配结果模式中的捕获组数。 |
6 | int start() 返回匹配的起始索引。 |
7 | int start(int group) 返回在此匹配期间由给定组捕获的子序列的起始索引。 |
Java Regex - Pattern Class
介绍 (Introduction)
java.util.regex.Pattern类表示正则表达式的编译表示。
类声明
以下是java.util.regex.Pattern类的声明 -
public final class Pattern
extends Object
implements Serializable
字段 (Field)
以下是java.util.regex.Duration类的字段 -
static int CANON_EQ - 启用规范等价。
static int CASE_INSENSITIVE - 启用不区分大小写的匹配。
static int COMMENTS - 允许模式中的空格和注释。
static int DOTALL - 启用dotall模式。
static int LITERAL - 启用模式的文字解析。
static int MULTILINE - 启用多行模式。
static int UNICODE_CASE - 启用支持Unicode的案例折叠。
static int UNICODE_CHARACTER_CLASS - 启用Unicode版本的预定义字符类和POSIX字符类。
static int UNIX_LINES - 启用Unix行模式。
类方法
Sr.No | 方法和描述 |
---|---|
1 | static Pattern compile(String regex) 将给定的正则表达式编译为模式。 |
2 | static Pattern compile(String regex,int flags) 将给定的正则表达式编译为具有给定标志的模式。 |
3 | int flags() 返回此模式的匹配标志。 |
4 | Matcher matcher(CharSequence input) 创建一个匹配此模式的给定输入的匹配器。 |
5 | static boolean matches(String regex,CharSequence input) 编译给定的正则表达式并尝试将给定的输入与其匹配。 |
6 | String pattern() 返回编译此模式的正则表达式。 |
7 | static String quote(String s) 返回指定String的文字模式String。 |
8 | String [] split(CharSequence输入) 围绕此模式的匹配拆分给定的输入序列。 |
9 | String [] split(CharSequence输入,int limit) 围绕此模式的匹配拆分给定的输入序列。 |
10 | String toString() 返回此模式的字符串表示形式。 |
方法继承
该类继承以下类中的方法 -
- Java.lang.Object
Java Regex - Matcher Class
介绍 (Introduction)
java.util.regex.Matcher类充当通过解释Pattern对字符序列执行匹配操作的引擎。
类声明
以下是java.util.regex.Matcher类的声明 -
public final class Matcher
extends Object
implements MatchResult
类方法
Sr.No | 方法和描述 |
---|---|
1 | Matcher appendReplacement(StringBuffer sb,String replacement) 实现非终端附加和替换步骤。 |
2 | StringBuffer appendTail(StringBuffer sb) 实现终端附加和替换步骤。 |
3 | int end() 返回最后一个字符匹配后的偏移量。 |
4 | int end(int group) 返回在上一个匹配操作期间由给定组捕获的子序列的最后一个字符之后的偏移量。 |
5 | boolean find() 尝试查找与模式匹配的输入序列的下一个子序列。 |
6 | boolean find(int start) 重置此匹配器,然后尝试从指定的索引处开始查找与模式匹配的输入序列的下一个子序列。 |
7 | String group() 返回上一个匹配操作期间给定组捕获的输入子序列。 |
8 | String group(String name) 返回在上一个匹配操作期间由给定命名捕获组捕获的输入子序列。 |
9 | int groupCount() 返回此匹配器模式中捕获组的数量。 |
10 | boolean hasAnchoringBounds() 查询此匹配器的区域边界的锚定。 |
11 | boolean hasTransparentBounds() 查询此匹配器的区域边界的透明度。 |
12 | boolean hitEnd() 如果在此匹配器执行的最后一个匹配操作中搜索引擎命中输入结尾,则返回true。 |
13 | boolean lookingAt() 尝试将从区域开头开始的输入序列与模式匹配。 |
14 | boolean matches() 尝试将整个区域与模式匹配。 |
15 | Pattern pattern() 返回此匹配器解释的模式。 |
16 | static String quoteReplacement(String s) 返回指定String的文字替换String。 |
17 | 匹配区域(int start,int end) 设置此匹配器区域的限制。 |
18 | int regionEnd() 报告此匹配器区域的结束索引(不包括)。 |
19 | int regionStart() 报告此匹配器区域的起始索引。 |
20 | String replaceAll(字符串替换) 将具有给定替换字符串的模式匹配的输入序列的每个子序列替换。 |
21 | String replaceFirst(String replacement) 将具有给定替换字符串的模式匹配的输入序列的第一个子序列替换。 |
22 | boolean requireEnd() 如果更多输入可以将正匹配更改为负匹配,则返回true。 |
23 | Matcher reset() 重置此匹配器。 |
24 | Matcher reset(CharSequence input) 使用新的输入序列重置此匹配器。 |
25 | int start() 返回上一个匹配的起始索引。 |
26 | int start(int group) 返回上一个匹配操作期间给定组捕获的子序列的起始索引。 |
27 | MatchResult toMatchResult() 返回此匹配器的匹配状态作为MatchResult。 |
28 | String toString() 返回此匹配器的字符串表示形式。 |
29 | Matcher useAnchoringBounds(boolean b) 设置此匹配器的区域边界的锚定。 |
30 | Matcher usePattern(Pattern newPattern) 更改此匹配器用于查找匹配项的模式。 |
31 | Matcher useTransparentBounds(boolean b) 设置此匹配器的区域边界的透明度。 |
方法继承
该类继承以下类中的方法 -
- Java.lang.Object
Java Regex - PatternSyntaxException Class
介绍 (Introduction)
java.util.regex.PatternSyntaxException类表示抛出的未经检查的异常,表示正则表达式模式中的语法错误。
类声明
以下是java.util.regex.PatternSyntaxException类的声明 -
public class PatternSyntaxException
extends IllegalArgumentException
构造函数 (Constructors)
Sr.No | 方法和描述 |
---|---|
1 | PatternSyntaxException(String desc, String regex, int index) 构造此类的新实例。 |
类方法
Sr.No | 方法和描述 |
---|---|
1 | String getDescription() 检索错误的描述。 |
2 | int getIndex() 检索错误索引。 |
3 | String getMessage() 返回一个多行字符串,其中包含语法错误及其索引的描述,错误的正则表达式模式以及模式中错误索引的可视指示。 |
4 | String getPattern() 检索错误的正则表达式模式。 |
方法继承
该类继承以下类中的方法 -
- Java.lang.Throwable
- Java.lang.Object
例子 (Example)
以下示例显示了java.util.regex.Pattern.PatternSyntaxException类方法的用法。
package com.iowiki;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
public class PatternSyntaxExceptionDemo {
private static String REGEX = "[";
private static String INPUT = "The dog says meow " + "All dogs say meow.";
private static String REPLACE = "cat";
public static void main(String[] args) {
try{
Pattern pattern = Pattern.compile(REGEX);
// get a matcher object
Matcher matcher = pattern.matcher(INPUT);
INPUT = matcher.replaceAll(REPLACE);
} catch(PatternSyntaxException e){
System.out.println("PatternSyntaxException: ");
System.out.println("Description: "+ e.getDescription());
System.out.println("Index: "+ e.getIndex());
System.out.println("Message: "+ e.getMessage());
System.out.println("Pattern: "+ e.getPattern());
}
}
}
让我们编译并运行上面的程序,这将产生以下结果 -
PatternSyntaxException:
Description: Unclosed character class
Index: 0
Message: Unclosed character class near index 0
[
^
Pattern: [
Java Regex - Examples Matching Characters
以下是在java中使用正则表达式匹配字符的各种示例。
Sr.No | 构造和匹配 |
---|---|
1 | x 人物x |
2 | \\ 反斜杠字符 |
3 | \0n 八进制值为0n的字符(0≤n≤7) |
4 | \0nn 八进制值为0nn(0≤n≤7)的字符 |
5 | \0mnn 八进制值为0mnn(0≤m≤3,0≤n≤7)的字符 |
6 | \xhh 具有十六进制值0xhh的字符 |
7 | \uhhhh 十六进制值为0xhhhh的字符 |
8 | \t 制表符('\ u0009') |
9 | \n 换行符(换行符)('\ u000A') |
10 | \r 回车符('\ u000D') |
11 | \f 换页字符('\ u000C') |
Java Regex - Matching Character Classes
以下是在java中使用正则表达式匹配字符类的各种示例。
Sr.No | 构造和匹配 |
---|---|
1 | [abc] a,b或c(简单类)。 |
2 | [^abc] 除a,b或c之外的任何字符(否定)。 |
3 | [a-zA-Z] a到z或A到Z,包括(范围)。 |
4 | [ad[mp]] a到d,或m到p:[a-dm-p](联合)。 |
5 | [az&&[def]] d,e或f(十字路口)。 |
6 | [az&&[^bc]] a到z,b和c除外:[ad-z](减法) |
7 | [az&&[^mp]] a到z,而不是m到p:[a-lq-z](减法)。 |
Matching Predefined Character Classes
以下是使用java中的正则表达式匹配预定义字符类的各种示例。
Sr.No | 构造和匹配 |
---|---|
1 | . 任何字符(可能与行终止符匹配也可能不匹配)。 |
2 | \d 数字:[0-9]。 |
3 | \D 非数字:[^ 0-9]。 |
4 | \s 空格字符:[\ t\n\x0B\f\r\n] |
5 | \S 非空白字符:[^\s]。 |
6 | \w 单词字符:[a-zA-Z_0-9]。 |
7 | \W 非单词字符:[^\w] |
Matching POSIX Character Classes
以下是使用java中的正则表达式匹配POSIX字符类的各种示例。
Sr.No | 构造和匹配 |
---|---|
1 | \p{Lower} 小写字母字符:[az]。 |
2 | \p{Upper} 大写字母字符:[AZ]。 |
3 | \p{ASCII} 所有ASCII:[\ x00-\x7F]。 |
4 | \p{Alpha} 字母字符:[\ p {Lower}\p {Upper}]。 |
5 | \p{Digit} 十进制数字:[0-9]。 |
6 | \p{Alnum} 字母数字字符:[\ p {Alpha}\p {Digit}]。 |
7 | \p{Punct} 标点符号:其中一个!“#$%&'()* +, - 。/:; <=>?@ [\ _] ^ _> {|} |
8 | \p{Graph} 一个可见的角色:[\ p {Alnum}\p {Punct}]。 |
9 | \p{Print} 可打印字符:[\ p {Graph}\x20]。 |
10 | \p{Blank} 空格或制表符:[\ t]。 |
11 | \p{XDigit} 十六进制数字:[0-9a-fA-F]。 |
12 | \p{Space} 一个空白字符:[\ t\n\x0B\f\r]。 |
Matching JAVA Character Classes
以下是在java中使用正则表达式匹配JAVA字符类的各种示例。
Sr.No | 构造和匹配 |
---|---|
1 | \p{javaLowerCase} 相当于java.lang.Character.isLowerCase()。 |
2 | \p{javaUpperCase} 相当于java.lang.Character.isUpperCase()。 |
3 | \p{javaWhitespace} 相当于java.lang.Character.isWhitespace()。 |
4 | \p{javaMirrored} 相当于java.lang.Character.isMirrored()。 |
Matching Unicode Character Classes
以下是使用java中的正则表达式匹配Unicode字符类的各种示例。
Sr.No | 构造和匹配 |
---|---|
1 | \p{IsLatin} 拉丁文字符。 |
2 | \p{InGreek} 希腊街区的一个角色。 |
3 | \p{Lu} 一个大写字母。 |
4 | \p{IsAlphabetic} 字母字符(二进制属性)。 |
5 | \p{Sc} 货币符号。 |
6 | \P{InGreek} 除希腊街区之外的任何角色。 |
7 | [\p{L}&&[^\p{Lu}]] 除大写字母外的任何字母。 |
Examples of Boundary Matchers
以下是在java中使用正则表达式的Boundary Matchers的各种示例。
Sr.No | 构造和匹配 |
---|---|
1 | ^ 一行的开头。 |
2 | $ 一行的结尾。 |
3 | \b 一个单词边界。 |
4 | \B 非字边界。 |
5 | \A 输入的开始。 |
6 | \G 上一场比赛结束。 |
7 | \Z 输入结束但是对于最终终止符,如果有的话。 |
8 | \z 输入结束。 |
Java Regexs of Greedy Quantifiers
贪心量词指示搜索引擎搜索整个字符串并检查它是否与给定的正则表达式匹配。 以下是在java中使用正则表达式的Greedy Quantifiers的各种示例。
Sr.No | 构造和匹配 |
---|---|
1 | X? X,曾经或根本没有。 |
2 | X* X,零次或多次 |
3 | X+ X,一次或多次。 |
4 | X{n} X,正好是n次。 |
5 | X{n,} X,至少n次。 |
6 | X{n,m} X,至少n但不超过m次 |
Examples of Reluctant Quantifiers
不情愿的量词表示搜索引擎以最短的字符串开头。 一旦找到匹配,引擎继续; 否则它会向正在检查的字符串部分添加一个字符并搜索该字符,依此类推。 此过程将一直进行,直到找到匹配项或整个字符串已用完为止。 以下是在java中使用正则表达式的Reluctant Quantifiers的各种示例。
Sr.No | 构造和匹配 |
---|---|
1 | X?? X,曾经或根本没有。 |
2 | X*? X,零次或多次 |
3 | X+? X,一次或多次。 |
4 | X{n}? X,正好是n次。 |
5 | X{n,}? X,至少n次。 |
6 | X{n,m}? X,至少n但不超过m次 |
Examples of Possessive Quantifiers
占有量词类似于贪心量词。 它通过检查整个字符串来指示启动引擎。如果它不起作用,如果匹配失败并且没有回头,则它在某种意义上是不同的。 以下是在java中使用正则表达式的占有量词的各种示例。
Sr.No | 构造和匹配 |
---|---|
1 | X?+ X,曾经或根本没有。 |
2 | X*+ X,零次或多次 |
3 | X++ X,一次或多次。 |
4 | X{n}+ X,正好是n次。 |
5 | X{n,}+ X,至少n次。 |
6 | X{n,m}+ X,至少n但不超过m次 |
Java Regex - Examples of Logical Operators
以下是在java中使用正则表达式的逻辑运算符的各种示例。
Sr.No | 构造和匹配 |
---|---|
1 | XY X后跟Y. |
2 | X|Y X或Y. |