【问题标题】:Comparing string prefixes in Groovy比较 Groovy 中的字符串前缀
【发布时间】:2016-02-11 18:44:21
【问题描述】:

这里是 Groovy 2.4.x。我有一个方法需要两个Strings,需要对它们做一些分析。

  • 如果两个字符串都不以“FIZZ”或“BUZZ”结尾,那么它应该返回false
  • 如果只有一个字符串以“FIZZ”或“BUZZ”结尾,那么它应该返回false
  • 如果两个字符串都以“FIZZ”或“BUZZ”结尾,那么我们继续...
    • 在这种情况下,我们要提取两个字符串的子字符串之前 "FIZZ"/"BUZZ" -> "prefixes"
    • 我们现在想简单地比较两个前缀。如果它们是相同的字符串,则返回true;否则,false

例子:

  • "foo" & "bar" => false(因为两者都不以“FIZZ”或“BUZZ”结尾)
  • "foo" & "barFIZZ" => false(因为只有 1 以 "FIZZ" 或 "BUZZ" 结尾)
  • fooFIZZ”&“barBUZZ”=>false(因为“foo”!=“bar”)
  • fooFIZZ”&“fooBUZZ”=>true(因为“foo”==“foo”)

这是我最好的尝试:

class FizzBuzzMatcher {
    boolean matches(String left, String right) {
        boolean matches = false
        if(right.endsWith('FIZZ') || right.endsWith('BUZZ')) {
            String rightPrefix
            rightPrefix = right.subSequence(0, right.indexOf('FIZZ'))
            if(rightPrefix.isEmpty()) {
                rightPrefix = right.subSequence(0, right.indexOf('BUZZ'))
            }

            if(left.endsWith('FIZZ') || left.endsWith('BUZZ')) {
                String leftPrefix
                leftPrefix = left.subSequence(0, left.indexOf('FIZZ'))
                if(leftPrefix.isEmpty()) {
                    leftPrefix = left.subSequence(0, left.indexOf('BUZZ'))
                }

                if(leftPrefix == rightPrefix) {
                    matches = true
                }
            }
        }

        matches
    }
}

...但是正如您所见,这有点令人讨厌。这里有更优雅的解决方案吗?我对 OSS 库(Apache Commons 等)持开放态度。

【问题讨论】:

  • xyz 的输出令人困惑,因为它看起来应该是 false,然后是 true。对吗?

标签: string groovy


【解决方案1】:

您可以尝试使用正则表达式:

​pattern = ~/(.*)(FIZZ|BUZZ)/

def matches(left, right) {
  def m1, m2
  return (m1 = (left =~ pattern)) && (m2 = (right =~ pattern)) 
    && (m1[0][1] == m2[0][1])
}

请参阅http://docs.groovy-lang.org/latest/html/documentation/index.html#_regular_expression_operators 了解正则表达式运算符的语法

【讨论】:

  • 谢谢@Jeremie B (+1) - 我可以假设m1m2 是布尔值,而subprefix 也返回一个布尔值吗?
  • m1 和 m2 是 Matcher-s 的实例,是与正则表达式匹配的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-19
  • 1970-01-01
  • 2014-05-08
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
  • 2016-12-30
相关资源
最近更新 更多