🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### [`Pattern`和`Matcher`](https://lingcoder.gitee.io/onjava8/#/book/18-Strings?id=pattern-%e5%92%8c-matcher) 通常,比起功能有限的`String`类,我们更愿意构造功能强大的正则表达式对象。只需导入`java.util.regex`包,然后用`static Pattern.compile()`方法来编译你的正则表达式即可。它会根据你的`String`类型的正则表达式生成一个`Pattern`对象。接下来,把你想要检索的字符串传入`Pattern`对象的`matcher()`方法。`matcher()`方法会生成一个`Matcher`对象,它有很多功能可用(可以参考`java.util.regext.Matcher`的 JDK 文档)。例如,它的`replaceAll()`方法能将所有匹配的部分都替换成你传入的参数。 作为第一个示例,下面的类可以用来测试正则表达式,看看它们能否匹配一个输入字符串。第一个控制台参数是将要用来搜索匹配的输入字符串,后面的一个或多个参数都是正则表达式,它们将被用来在输入的第一个字符串中查找匹配。在Unix/Linux上,命令行中的正则表达式必须用引号括起来。这个程序在测试正则表达式时很有用,特别是当你想验证它们是否具备你所期待的匹配功能的时候。[^3](https://lingcoder.gitee.io/onjava8/#/%E7%BD%91%E4%B8%8A%E8%BF%98%E6%9C%89%E5%BE%88%E5%A4%9A%E5%AE%9E%E7%94%A8%E5%B9%B6%E4%B8%94%E6%88%90%E7%86%9F%E7%9A%84%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%B7%A5%E5%85%B7%E3%80%82) ~~~ // strings/TestRegularExpression.java // Simple regular expression demonstration // {java TestRegularExpression // abcabcabcdefabc "abc+" "(abc)+" } import java.util.regex.*; public class TestRegularExpression { public static void main(String[] args) { if(args.length < 2) { System.out.println( "Usage:\njava TestRegularExpression " + "characterSequence regularExpression+"); System.exit(0); } System.out.println("Input: \"" + args[0] + "\""); for(String arg : args) { System.out.println( "Regular expression: \"" + arg + "\""); Pattern p = Pattern.compile(arg); Matcher m = p.matcher(args[0]); while(m.find()) { System.out.println( "Match \"" + m.group() + "\" at positions " + m.start() + "-" + (m.end() - 1)); } } } } /* Output: Input: "abcabcabcdefabc" Regular expression: "abcabcabcdefabc" Match "abcabcabcdefabc" at positions 0-14 Regular expression: "abc+" Match "abc" at positions 0-2 Match "abc" at positions 3-5 Match "abc" at positions 6-8 Match "abc" at positions 12-14 Regular expression: "(abc)+" Match "abcabcabc" at positions 0-8 Match "abc" at positions 12-14 */ ~~~ 还可以在控制台参数中加入`“(abc){2,}”`,看看执行结果。 `Pattern`对象表示编译后的正则表达式。从这个例子可以看到,我们使用已编译的`Pattern`对象上的`matcher()`方法,加上一个输入字符串,从而共同构造了一个`Matcher`对象。同时,`Pattern`类还提供了一个`static`方法: ~~~ static boolean matches(String regex, CharSequence input) ~~~ 该方法用以检查`regex`是否匹配整个`CharSequence`类型的`input`参数。编译后的`Pattern`对象还提供了`split()`方法,它从匹配了`regex`的地方分割输入字符串,返回分割后的子字符串`String`数组。 通过调用`Pattern.matcher()`方法,并传入一个字符串参数,我们得到了一个`Matcher`对象。使用`Matcher`上的方法,我们将能够判断各种不同类型的匹配是否成功: ~~~ boolean matches() boolean lookingAt() boolean find() boolean find(int start) ~~~ 其中的`matches()`方法用来判断整个输入字符串是否匹配正则表达式模式,而`lookingAt()`则用来判断该字符串(不必是整个字符串)的起始部分是否能够匹配模式。