如何使用Groovy的正则表达式获得部分匹配的布尔值?

时间:2017-07-19 15:37:51

标签: regex groovy

Groovy有一个正则表达式“匹配运算符”(==~)。 documentation表示它返回一个布尔值,但需要“严格匹配”。它没有定义“严格匹配”。

我不熟悉此表达式为false的任何正则表达式系统。但是,这就是Groovy告诉我的。

'foo-bar-baz' ==~ /bar/ // => false

查找运算符(=~)返回Matcher,显然可以为匹配和捕获组编制索引。但是,我必须编写一个显式测试,让这个表达式返回一个布尔值。

('foo-bar-baz' =~ /bar/)[0] != null // => true

两个问题......

  1. 什么是“严格匹配”?
  2. 如何在不向表达式添加大量垃圾的情况下获取布尔值?

1 个答案:

答案 0 :(得分:3)

'foo-bar-baz' ==~ /bar/等于"foo-bar-baz".matches("bar"),也就是说,它需要完整的字符串匹配。

=~运算符允许部分匹配,也就是说,它可以在字符串中找到匹配/匹配。

因此:

println('foo-bar-baz' ==~ /bar/) // => false
println('bar' ==~ /bar/)         // => true
println('foo-bar-baz' =~ /bar/)  // => java.util.regex.Matcher[pattern=bar region=0,11 lastmatch=]

请参阅此Groovy demo

如果您需要检查部分匹配,则无法避免构建 Matcher 对象:

  

使用查找运算符=~构建 java.util.regex.Matcher 实例

   def text = "some text to match"
   def m = text =~ /match/                                           
   assert m instanceof Matcher                                       
   if (!m) {                                                         
       throw new RuntimeException("Oops, text not found!")
   }
     

if (!m)相当于调用if (!m.find())

或者,您可以使用!两次将结果转换为正确的布尔值:

println(!!('foo-bar-baz' =~ /bar/))

Returns true