代码之家  ›  专栏  ›  技术社区  ›  Adam Burley

如何使用JavaRePATALL查找Java中的两个字符串共用的字符?

  •  6
  • Adam Burley  · 技术社区  · 14 年前

    所以假设我有:

    String s = "1479K";
    String t = "459LP";
    

    我想回去

    String commonChars = "49";
    

    两个字符串之间的公用字符。

    显然,使用标准循环是可能的,比如:

    String commonChars = "";
    for (i = 0; i < s.length; i++)
    {
        char ch = s.charAt(i);
        if (t.indexOf(ch) != -1)
        {
            commonChars = commonChars + ch;
        }
    }
    

    但是,我希望能够使用 replaceAll . 这可以按如下方式进行:

    String commonChars = s.replaceAll("["+s.replaceAll("["+t+"]","")+"]","");
    

    我的问题是:是否可以使用 替换所有 ?正则表达式是什么?我想我得向前看一看,但当我想到它的时候,我的大脑就变得模糊了。

    4 回复  |  直到 12 年前
        1
  •  4
  •   vitaut    14 年前
    String commonChars = s.replaceAll("[^"+t+"]","");
    

    请注意,您可能需要在 t ,例如使用 Pattern.quote(t) 而不是 T 上面。

        2
  •  4
  •   codaddict    14 年前

    接受的答案:

    String commonChars = s.replaceAll("[^"+t+"]","");
    

    有一个bug!!!!

    如果绳子 t 有regex元字符吗?在这种情况下 replaceAll 失败。

    See this program 例如,字符串 T ] 在IT和 ] 是标记字符类结尾的regex元字符。显然,程序不能产生预期的输出。

    为什么?

    考虑:

    String s = "1479K";
    String t = "459LP]";
    

    现在正则表达式将变为 T ):

    String commonChars = s.replaceAll("[^459LP]]","");
    

    它表示替换除 4 , 5 , 9 , L , P 其次是 ] 一无所有。这显然不是你想要的。

    为了解决这些问题,你需要逃离 ] 在里面 T . 您可以手动执行此操作:

    String t = "459LP\\]";
    

    以及 regex works fine .

    这是使用regex时的常见问题,因此 java.util.regex.Pattern 类提供名为 quote 它可以用来做这一点:引用regex元字符,以便从字面上处理它们。

    所以在使用前 T 在里面 替换所有 你引用它为:

    t = Pattern.quote(t);
    

    Program using quote method 按预期工作。

        3
  •  2
  •   Jack Ishu    12 年前

    接受的答案不正确。因为 replaceall 是一个模式,所以我们必须考虑语法。 如果 s1=“\\t” ,会发生什么?如果 s1=“]”,会发生什么?

    如果所有字符都在[0-255]范围内,我们可以这样工作:

    1. byte[]tmp=new byte[255];
    2. 循环第一个字符串中的每个字符

      for(char c:str1.tochararray())
      //或者在这里使用charat(i)if(tmp[c]==0)tmp[c]=1;

    3. 循环第二个字符串中的每个字符

      for(char c:str2.tochararray()) 如果(tmp[c]==1)tmp[c]=2;

    4. 循环tmp数组,查找值为2的成员,索引 我们要找的是正确的字符吗?

    另一个解决方案是使用 hashset.retainal(collection<?>c);

    语法。 如果 s1 = "\\t" ?如果 s1 = "]{" ?

    如果所有字符都在[0-255]范围内,我们可以这样工作:

    1. byte[] tmp = new byte[255];
    2. 循环第一个字符串中的每个字符

      for(char c:str1.tochararray())
      //如果(tmp[c]=0)tmp[c]=1,则在此使用charat(i);

    3. 循环第二个字符串中的每个字符

      for (char c : str2.toCharArray()) if (tmp[c] == 1) tmp[c] = 2;

    4. 循环tmp数组,查找值为2的成员,索引 是我们要找的合适的字符。

    另一个解决方案是使用 HashSet.retainAll(Collection<?> c);

        4
  •  1
  •   Perception    13 年前
    public class common {
    
       public static void main(String args[]) {
          String s = "FIRST";
          String s1 = "SECOND";
          String common = s.replaceAll("[^" + s1 + "]", "");
          System.out.println(common);
       }
    }