模式匹配取反

Groovy 提供了简便的正则语法,可以很方便进行模式匹配和断言。

1
def regex = ~'Groovy'

当Groovy运算符=〜在if和while语句(见第8章)中作为谓词(返回布尔值的表达式)出现时,左侧的String操作数与右侧的正则表达式操作数匹配。因此,以下每个都传递值true。

当定义正则表达式时,可以使用以下特殊字符:

  • 有两个特殊的位置字符用于表示一行的开始和结束:caret(∧)和美元符号($)。
  • 正则表达式也可以包括量词。加号(+)表示一次或多次,应用于表达式的前一个元素。星号(*)用于表示零个或多个出现。问号(?)表示零或一次。
  • 元字符{和}用于匹配前一个字符的特定数量的实例。
  • 在正则表达式中,句点符号(。)可以表示任何字符。这被描述为通配符。
  • 正则表达式可以包括字符类。一组字符可以作为简单的字符序列,包含在元字符[和]中,如[aeiou]中。对于字母或数字范围,可以使用[a-z]或[a-mA-M]中的短划线分隔符。字符类的补码由方括号内的前导插入符号表示,如[∧a-z]中所示,并表示除指定的字符以外的所有字符。

实例

1
2
3
4
5
6
7
'Groovy' =~ 'Groovy' 
'Groovy' =~ 'oo'
'Groovy' ==~ 'Groovy'
'Groovy' ==~ 'oo'
'Groovy' =~ '∧G'
‘Groovy' =~ 'G$'
‘Groovy' =~ 'Gro*vy' 'Groovy' =~ 'Gro{2}vy'

ATTENTIONS

当使用一个等号 = 表示匹配,即 Matcher.matches()
使用两个等号 == 表示取组,即 Mathcer.groups()
如果需要取反条件,想当然使用 ! 插入表达式进行取反,结果是不会正常的。
使用 != 语法是无意义的,它表示 matches() 取反,matcher() 会一直有值, 因此不管什么样的输入都将返回False

正确做法:

1
2
'machine-a' =~~ 'machine-[abc]'  // 使用两个 ~~
!('machine-a' =~ 'machine-[abc]') // 表达式使用括号包围得返回值取反