String Groovy中字符串前缀的比较

String Groovy中字符串前缀的比较,string,groovy,String,Groovy,这里是Groovy 2.4.x。我有一个方法,它接受两个字符串,需要对它们进行一些分析 如果两个字符串均以“FIZZ”或“BUZZ”结尾,则应返回false 如果只有一个字符串以“FIZZ”或“BUZZ”结尾,那么它应该返回false 如果两个字符串都以“FIZZ”或“BUZZ”结尾,那么我们继续。。。 在本例中,我们希望在“FIZZ”/“BUZZ”->“前缀”之前提取两个字符串的子字符串 我们现在只想比较两个前缀。如果它们是相同的字符串,则返回true;否则,false 示例: “f

这里是Groovy 2.4.x。我有一个方法,它接受两个
字符串
,需要对它们进行一些分析

  • 如果两个字符串均以“
    FIZZ
    ”或“
    BUZZ
    ”结尾,则应返回
    false
  • 如果只有一个字符串以“
    FIZZ
    ”或“
    BUZZ
    ”结尾,那么它应该返回
    false
  • 如果两个字符串都以“
    FIZZ
    ”或“
    BUZZ
    ”结尾,那么我们继续。。。
    • 在本例中,我们希望在“
      FIZZ
      ”/“
      BUZZ
      ”->“前缀”之前提取两个字符串的子字符串
    • 我们现在只想比较两个前缀。如果它们是相同的字符串,则返回
      true
      ;否则,
      false
示例:

  • foo
    ”&“
    bar
    ”=>
    false
    (因为两者都以“
    FIZZ
    ”或“
    BUZZ
    ”结尾)
  • foo
    ”&“
    barFIZZ
    ”=>
    false
    (因为只有1个以“
    FIZZ
    ”或“
    BUZZ
    ”结尾)
  • fooFIZZ
    ”&“
    barBUZZ
    ”=>
    false
    (因为“
    foo
    ”!=”
    bar
    ”)
  • fooFIZZ
    ”&“
    foobusz
    ”=>
    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 LIB(Apache Commons等)持开放态度。

您可以尝试使用regexp:

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

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

有关regexp运算符的语法,请参见。您可以尝试使用regexp:

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

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

有关regexp运算符的语法,请参阅。
xyz
输出看起来应该是
false
,然后是
true
。这是正确的吗?
xyz
输出在看起来应该是
false
然后是
true
时会令人困惑。这是正确的吗?谢谢@Jeremie B(+1)-我可以假设
m1
m2
是布尔值,并且
subprefix
也返回布尔值吗?m1和m2是Matcher-s的实例,是与regexp匹配的结果。谢谢@Jeremie B(+1)-我可以假设
m1
m2
是布尔值,并且
subprefix
也返回布尔值吗?m1和m2是Matcher-s的实例,是与regexp匹配的结果。