Java为使用正则表达式进行模式匹配提供了java.util.regex包,Java正则表达式非常类似于Perl编程语言,并且非常容易学习。
regex包主要由以下三个类组成
Pattern class - Pattern对象是正则表达式的表示形式,没有提供公共构造函数。
Matcher class - Matcher对象是解释模式并对输入字符串执行匹配操作的引擎。
PatternSyntaxException - PatternSyntaxException对象是一个未检查的异常,指示正则表达式模式中的语法错误。
捕获组是一种将多个字符视为一个单元的方法。如正则表达式(Dog)创建一个包含字母“ d”,“ o”和“ g”的单个组。
捕获组通过从左到右计数其左括号进行编号。如在表达式(A)(B(C)中,存在四个这样的组-
若要了解表达式中存在多少个组,请对Matcher 对象调用groupCount方法,groupCount方法返回一个int,显示匹配器模式中存在的捕获组的数量。
还有一个特殊的组,组0,它始终表示整个表达式,此组不包括在groupCount报告的总数中。
以下示例说明如何从给定的字母数字字符串中查找数字字符串
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { public static void main( String args[] ) { //要扫描的字符串以查找模式。 String line = "This order was placed for QT3000! OK?"; String pattern = "(.*)(\\d+)(.*)"; //创建Pattern对象 Pattern r = Pattern.compile(pattern); //现在创建匹配器对象。 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"); } } }
这将产生以下输出-
Found value: This order was placed for QT3000! OK? Found value: This order was placed for QT300 Found value: 0
下面的表列出了java-中可用的所有正则表达式元字符语法
Subexpression | Matches |
---|---|
^ | 匹配行的开头。 |
$ | 匹配行的结尾。 |
. | 匹配除换行符以外的任何单个字符。 |
[...] | 匹配括号中的任何单个字符。 |
[^...] | 匹配任何不在方括号中的单个字符。 |
\A | 整个字符串的开头。 |
\z | 整个字符串的结尾。 |
\Z | 整个字符串的结尾,但允许的最后一行终止符除外。 |
re* | 匹配0个或多个 |
re+ | 匹配1个或多个 |
re? | 匹配0或1个。 |
re{ n} | 精确匹配n个。 |
re{ n,} | 至少匹配n个。 |
re{ n, m} | 至少匹配n个,最多匹配m个。 |
a| b | 匹配a或b。 |
(re) | 分组匹配 |
(?: re) | 分组匹配,而无需记住匹配的文本。 |
(?> re) | 匹配独立模式而不回溯。 |
\w | 匹配单词字符。 |
\W | 匹配非单词字符。 |
\s | 匹配空白。 等效于[\t\n\r\f]。 |
\S | 匹配非空格。 |
\d | 匹配数字。 相当于[0-9]。 |
\D | 匹配非数字。 |
\A | 匹配字符串的开头。 |
\Z | 匹配字符串的结尾。 如果存在换行符,则匹配换行符。 |
\z | 匹配字符串的结尾。 |
\G | 匹配最后结束点。 |
\n | 匹配换行“n”。 |
\b | 匹配单词边界。 |
\B | 匹配非单词边界。 |
\n,\t, etc. | 匹配换行符,回车符,制表符等。 |
\Q | 转义(引号)所有字符,直到\E。 |
\E | 结束语以\Q开头。 |
索引方法提供有用的索引值,这些索引值精确地显示了在输入字符串-中找到匹配的位置
Sr.No. | Method & Remark |
---|---|
1 | public int start() 返回上一个匹配项的开始索引。 |
2 | public int start(Int Group) 返回给定组在上一次匹配操作期间捕获的子序列的开始索引。 |
3 | public int end() 返回匹配的最后一个字符之后的偏移量。 |
4 | public int end(Int Group) 返回在上一个匹配操作期间由给定组捕获的子序列的最后一个字符之后的偏移量。 |
查找方法检查输入字符串并返回一个布尔值,指示是否找到-模式
Sr.No. | Method & Remark |
---|---|
1 | public boolean lookingAt() 尝试将输入序列与模式进行匹配,从开头开始。 |
2 | public boolean find() 尝试查找与模式匹配的输入序列的下一个子序列。 |
3 | public boolean find(Int Start) 重置此匹配器,然后尝试查找与模式匹配的输入序列的下一个子序列,从指定的索引处开始。 |
4 | public boolean matches() 尝试将整个区域与模式进行匹配。 |
替换方法是用于替换输入字符串中的文本的有用方法
Sr.No. | Method & Remark |
---|---|
1 | public Matcher appendReplace(StringBuffer sb,String replacement) 实现追加和替换操作。 |
2 | public StringBuffer appendTail(StringBuffer sb) 实现终端附加和替换步骤。 |
3 | public String replaceAll(String replacement) 用给定的替换字符串替换与模式匹配的输入序列的每个子序列。 |
4 | public String replaceFirst(String replacement) 用给定的替换字符串替换与模式匹配的输入序列的第一个子序列。 |
5 | public static String quoteReplace(string s) 返回指定字符串的文字替换字符串。此方法生成一个字符串,该字符串将作为Matcher类的appendReplace方法中的文字替换。 |
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { private static final String REGEX = "\\bcat\\b"; private static final String INPUT = "cat cat cat cattie cat"; public static void main( String args[] ) { Pattern p = Pattern.compile(REGEX); Matcher m = p.matcher(INPUT); //获取匹配器对象 int count = 0; while(m.find()) { count++; System.out.println("Match number "+count); System.out.println("start(): "+m.start()); System.out.println("end(): "+m.end()); } } }
这将产生以下输出-
Match number 1 start(): 0 end(): 3 Match number 2 start(): 4 end(): 7 Match number 3 start(): 8 end(): 11 Match number 4 start(): 19 end(): 22
matches和lookingAt方法都试图将输入序列与模式进行匹配。然而,不同的是,matches要求匹配整个输入序列,而lookingAt不需要。
这两种方法始终从输入字符串的开头开始。下面是解释函数-的示例
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { private static final String REGEX = "foo"; private static final String INPUT = "fooooooooooooooooo"; private static Pattern pattern; private static Matcher matcher; public static void main( String args[] ) { pattern = Pattern.compile(REGEX); matcher = pattern.matcher(INPUT); System.out.println("Current REGEX is: "+REGEX); System.out.println("Current INPUT is: "+INPUT); System.out.println("lookingAt(): "+matcher.lookingAt()); System.out.println("matches(): "+matcher.matches()); } }
这将产生以下输出-
Current REGEX is: foo Current INPUT is: fooooooooooooooooo lookingAt(): true matches(): false
replaceFirst和replaceAll方法替换与给定正则表达式匹配的文本。顾名思义,replaceFirst替换第一个匹配项,replaceAll替换所有匹配项。
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { private static String REGEX = "dog"; private static String INPUT = "The dog says meow. " + "All dogs say meow."; private static String REPLACE = "cat"; public static void main(String[] args) { Pattern p = Pattern.compile(REGEX); //获取匹配器对象 Matcher m = p.matcher(INPUT); INPUT = m.replaceAll(REPLACE); System.out.println(INPUT); } }
这将产生以下输出-
The cat says meow. All cats say meow.
Matcher类还为文本替换提供appendReplace和appendTail方法。
import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { private static String REGEX = "a*b"; private static String INPUT = "aabfooaabfooabfoob"; private static String REPLACE = "-"; public static void main(String[] args) { Pattern p = Pattern.compile(REGEX); //获取匹配器对象 Matcher m = p.matcher(INPUT); StringBuffer sb = new StringBuffer(); while(m.find()) { m.appendReplacement(sb, REPLACE); } m.appendTail(sb); System.out.println(sb.toString()); } }
这将产生以下输出-
-foo-foo-foo-
PatternSyntaxException是一个未经检查的异常,它指示正则表达式模式中的语法错误。PatternSyntaxException类提供以下方法来帮助您确定错误的-
Sr.No. | Method & Remark |
---|---|
1 | public String getRemark() 检索错误的说明。 |
2 | public int getIndex() 检索错误索引。 |
3 | public String getPattern() 链接:https://www.learnfk.comhttps://www.learnfk.com/java/java-regular-expressions.html 来源:LearnFk无涯教程网 检索错误的正则表达式模式。 |
4 | public String getMessage() 返回一个多行字符串,其中包含语法错误及其索引的说明、错误的正则表达式模式以及模式内错误索引的可视指示。 |
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)
HarmonyOS快速入门与实战 -〔QCon+案例研习社〕