启用dotall模式。在dotall模式下,模式中的.匹配随便率性字符,包含换行符。在默认情况下(即未启用dotall模式),.不匹配换行符。等价于润饰符(?s)。
启用Unix换行模式,应用"\n"标识每一行的末尾,等价于润饰符(?d)。
先测验测验履行下面的代码:
- println("play \n scala".matches(".*"))
你没看错,打印结不雅是false。正如键盘构造一样,这是因为一个汗青问题导致的。早期的┞俘则表达式对象是基于行处理文本的,所以.匹配的是除换行符以外的随便率性字符。大年夜多半编程说话在设计正则表达式时沿用了这个传统,然则供给一个选项用于开启"点号匹配换行符"模式。
沙龙晃荡 | 去哪儿、陌陌、ThoughtWorks在主动化运维中的实践!10.28不见不散!
Java供给了两种方法开启"点号匹配换行符"模式,第一种方法是在构建Pattern对象时指定匹配模式:
- val p = Pattern.compile(".*", Pattern.DOTALL)
- println(p.matcher("play\nscala").matches()) // true
另一种方法是在正则表达式开端地位指定嵌入模式润饰符(embedded mode modifier),这也是一种比较通用的方法:
- println("play\nscala".matches("(?s).*")) // true
Java常用的匹配模式有以下几种:
1) Pattern.DOTALL
- val p = Pattern.compile(".*", Pattern.DOTALL)
- val m = p.matcher("play\nscala")
- println(m.matches())
- // 输出
- true
2)Pattern.MULTILINE
启用多行匹配模式。在多行匹配模式下,模式中的^和$将逐次匹配每一行的行首和行尾。在默认情况下(即未启用多行匹配模式),^和$将匹拍┞符个字符串的首部和尾部。等价于润饰符(?m)。
- val p = Pattern.compile("^.*$", Pattern.MULTILINE)
- val m = p.matcher("play\nscala")
- while (m.find()) {
- println("find: " + m.group(0))
- }
- // 输出
- find: play
- find: scala
3) Pattern.UNIX_LINES
- val p = Pattern.compile("^.*$", Pattern.UNIX_LINES | Pattern.MULTILINE)
- val m = p.matcher("play\r\nscala")
- while (m.find()) {
- println("find: " + m.group(0).length)
- }
- // 输出
- find: 5
- find: 5
输出的两个结不雅长度都为5,原因是play末尾还有一个字符\r。
4)Pattern.CASE_INSENSITIVE
启用大年夜小写不敏感匹配,等价于润饰符(?i)。