java 中的正则使用
说明:在 java 中使用正则,主要是 java.util.regex.Pattern
和 java.util.regex.Matcher
这两个类相关
常用的调用匹配正则的方法
- String#matches(arg1)
// 可以看到内部也是调用的 Pattern#matches(arg1,arg2) 方法 public boolean matches(String regex) { return Pattern.matches(regex, this); }
- Pattern#matches(arg1,arg2)
// 直接调用 Pattern#matches(arg1,arg2) 方法 public static boolean matches(String regex, CharSequence input) { Pattern p = Pattern.compile(regex); Matcher m = p.matcher(input); return m.matches(); }
- Pattern#compile(arg1) -> Pattern#matcher(arg1)
// 或者 像Pattern#matches(arg1,arg2) 方法,内部的代码实现一样, // 先 Pattern#compile(arg1) 获得Pattern 对象,在调用 Pattern#matcher(arg1) 获得 Matcher 对象 public static Pattern compile(String regex) { return new Pattern(regex, 0); }
说明:这几个方法的实质其实时一样的,都是传入 要匹配的对象和正则表达式,先获得Pattern对象,
然后通过Pattern#matcher(arg1) 获得Matcher 对象,直接返回 Matcher#matches() 的结果,
Matcher#matches() 对于传入的某个字符串的全部 与 正则表达式 进行匹配. 但是一些其他的操作就不是很方便了,
比如说 进行组匹配,查询,搜索等操作就不容易实现
正则表达式的组匹配 或 其他操作
如何实现,还是通过Pattern#compile(arg1) 获得 Pattern 对象,然后 Pattern#matcher(arg1) 获得 Matcher 对象,此时在通过具体的方法去执行对应的匹配判断
比如:查询一个组查询,此时可以通过 Matcher#find() 方法,去查询 字符串 中 符合 正则表达式 组(字符串片段)有几处
Matcher 三个匹配方法的区别
matcher
完全匹配find
尝试查找与模式匹配的输入序列的下一个子序列。这个方法从这个匹配器区域的开头开始,或者,如果之前的方法调用成功且匹配器此后没有重置,则从前一个匹配项不匹配的第一个字符开始。lookingAt
尝试匹配输入序列(从区域的开头开始)与模式.与matches方法一样,该方法总是从区域的开始处开始;与该方法不同,它不要求匹配整个区域。
说明:这三个方法都返回 boolean 来指示是否匹配成功
关于匹配组
具体请查看 Pattern 类注释中 Groups and capturing
部分
例如: (d{1}|d{2})(,(d{1}|d{2})){6}
从组的规则来说应该有4个组, 第一个 是默认的 0 索引代表的 整个输入字符串算一个组, 第二个 从左往右看 (d{1}|d{2})
第三个 (,(d{1}|d{2}))
,第四个 (d{1}|d{2})
,但是由于第二个和第四个重合时一样的,因此算一个,因此匹配组的时候,返回的 groupCount() 数量就是3,
一些正则表达式的例子
[^0-9\.]
验证非数字和小数点
2\d{3}(\-\d{2}){2}\s+\d{2}(\:\d{2}){2}
表示 yyyy-MM-dd HH:mm:ss 时间格式
(d{1}|d{2})(,(d{1}|d{2})){6}
验证数字格式,例如:01,7,02,03,05,06,7