【问题标题】:Java String contains "splitted" StringJava字符串包含“拆分”字符串
【发布时间】:2014-07-30 14:44:54
【问题描述】:

检查 Java 字符串 A 是否包含另一个字符串 B(即使 B 字符不连续)的最佳方法是什么?

例如:“takaderoka”包含“tkdr”但不包含“tkkr”。

是否有内置函数,还是我必须自己编写? 谢谢。

【问题讨论】:

  • str.matches( "t.*k.*d.*r" )
  • @clcto str.matches( ".*t.*k.*d.*r.*" )matches auto-anchors^$
  • @user3218114 是的,订单很重要。
  • @clcto 和 sp00m 使用您的解决方案,我必须以某种方式处理字符串 B。无论如何,这可能是一个很好的解决方案。谢谢
  • 每个人发布的正则表达式都可以工作,但如果你想玩得开心(并浪费时间),请查看动态编程以找到 2 个字符串的最长公共子序列 :)

标签: java string split char contain


【解决方案1】:

没有内置函数,但可以一行完成:

"takaderoka".matches("tkkr".replace("", ".*"));

或者把它放在一个函数中:

static boolean matcher(String one, String two) {
    return one.matches(two.replace("", ".*"));
}

【讨论】:

  • @user3218114 是的,这个正则表达式保留了顺序......你的测试将返回true,因为它应该
【解决方案2】:

一个简单的 java 程序,您可以将其用作 utility 方法。 [还会考虑顺序。]

public static boolean isMatched(String s1, String s2) {
    int index = -1;
    for (char ch : s2.toCharArray()) {
        if ((index = s1.indexOf(ch, index + 1)) == -1) {
            return false;
        }
    }
    return true;
}

...
System.out.println(isMatched("takaderoka", "tkdr")); // true
System.out.println(isMatched("takaderoka", "tkkr")); // false

您可以使其更加优化

public static boolean isMatched(String s1, String s2) {
    if ((s1.length() > 0 && s2.length() == 0) || (s2.length() > s1.length())) {
        return false;
    } else if (s1.indexOf(s2) != -1 || s1.equals(s2)) {
        return true;
    } else {
        int index = -1;
        for (char ch : s2.toCharArray()) {
            if ((index = s1.indexOf(ch, index + 1)) == -1) {
                return false;
            }
        }
    }
    return true;
}

【讨论】:

    【解决方案3】:

    您可以在搜索字符串上执行正则表达式匹配,在每个字符之间插入“.*”,或者只需编写自己的搜索来依次搜索每个字符。

    【讨论】:

      【解决方案4】:

      您可以使用 String 类的 contains() 方法。查看 String 类的方法以及 Java 中的 Regex 表达式。

      【讨论】:

        【解决方案5】:

        我会使用 apache commons StringUtils.getLevenshteinDistance() 函数。

        基本上,它衡量您必须进行多少修改才能将一个字符串转换为另一个字符串。因此,您的问题与知道将所有其他字母转换为空值是否与它们的长度之间的差异相同。

        例如

        StringUtils.getLevenshteinDistance("takaderoka","tkdr"); //6,   
        StringUtils.getLevenshteinDistance("takaderoka","tkkr"); //7, 
        

        如果结果 = "takaderoka".length - "tkdr".length = 6,则 "takaderoka" 包含 "tkdr"

        【讨论】:

          【解决方案6】:

          你可以用这个方法。可以重构以获得更好的代码。

           private boolean contains(String source, String toMatch) {
              boolean result = false;
              if (toMatch.length() == 0 || source.length() == 0) {
                  return result;
              }
              int j = 0;
              for (int i = 0; i < source.length(); i++) {
                  if (toMatch.length() - j > source.length() - i) {
                      break;
                  }
                  if (source.charAt(i) == toMatch.charAt(j)) {
                      j++;
                  }
                  if (j == toMatch.length()) {
                      result = true;
                      break;
                  }
              }
          
              return result;
          }
          

          【讨论】:

          • 测试这个contains("a", "")
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-05-27
          • 2022-11-11
          • 1970-01-01
          • 1970-01-01
          • 2020-10-22
          • 2019-06-03
          • 1970-01-01
          相关资源
          最近更新 更多