【问题标题】:Java 1.3 String.replaceAll() , replacementJava 1.3 String.replaceAll() ,替换
【发布时间】:2013-11-13 20:53:45
【问题描述】:

确切地说,我正在与一些非常老的 Java. 1.3 合作。

我正在尝试通过删除非字母字符(标点符号和数字等)来清理一些 String 输入

通常我会这样做:

String.replaceAll("[^A-Za-z]", "");

但是,.replaceAll() 是在Java 1.4 中引入的!所以它不会编译! http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#replaceAll(java.lang.String, java.lang.String)

Java 1.4 之前我们是如何做到这一点的?

【问题讨论】:

  • @SotiriosDelimanolis:我的职业生涯始于 Java 1.2,所以很少。
  • @SotiriosDelimanolis Java 1.3 存在。我还活着。所以是的;)。我认为一个更好的问题是:“在 Java 1.4 存在之前,stackoverflow 上的任何人都还活着吗?”
  • 剥夺了我信赖的replaceAll() 方法,如果是我,我会遍历StringtoCharArray() 版本并构建一个新字符串,跳过字母表之外的任何字符范围
  • @StormeHawke 这实际上可能比正则表达式 replaceAll 快。您应该将此作为答案发布。
  • @Cruncher 我想有人已经抓住了我的想法。不用担心,问题已得到解答

标签: java regex


【解决方案1】:

也许你可以像这样写一个简单的循环:

char[] origArr = str.toCharArray();
char[] destArr = new char[origArr.length];
int j = 0;
for (int i=0; i < origArr.length; i++) {
    char c = origArr[i];
    if ((c >= 65 && c <= 90) || (c >= 97 && c <= 122))
       destArr[j++] = c;
}

String dest = new String(destArr, 0, j);

抱歉没有JDK1.3来测试一下。

【讨论】:

  • 这就是我要做的。但是,可能将最终构造函数更改为 String dest = new String(destArr, 0, j) 以确保 dest 不会对那些额外的 Array 元素做任何事情。
  • @quazzieclodo:是的,我考虑过,但不确定该构造函数在 JDK 1.3 中是否可用,但是是的,那么 String dest = new String(destArr, 0, j); 应该在结束。
  • docs,从一开始就存在。 (至少没有“自从:”部分)
  • @quazzieclodo:非常感谢您查看文档。我已经相应地更新了答案。
【解决方案2】:

看看这是否有效:

public static String replaceAll(
    String haystack,              // String to search in
    String needle,                // Substring to find
    String replacement) {         // Substring to replace with

    int i = haystack.lastIndexOf( needle );
    if ( i != -1 ) {
        StringBuffer buffer = new StringBuffer( haystack );
        buffer.replace( i, i+needle.length(), replacement );
        while( (i=haystack.lastIndexOf(needle, i-1)) != -1 ) {
            buffer.replace( i, i+needle.length(), replacement );
        }
        haystack = buffer.toString();
    }

    return haystack;
}

编辑:这不支持正则表达式。由于您希望擦除的不仅仅是单个字符,我建议您调整此代码以允许 needles 数组或(丑陋的方法)循环遍历不允许的字符并重复调用该函数。

【讨论】:

  • 计时器仍在计时 - 但已编译!我将通过它抛出一些数据,看看输出是否按预期结束(它应该来自我所看到的)。
  • lastIndexOf(String) 不处理正则表达式,我相信。在 1.4 之前,Pattern 类甚至不在 java 中
  • @quazzieclodo:虽然你完全正确,但我相信我在 21 秒之内击败了你 :-)
【解决方案3】:

您可以使用 Apache 软件基金会的 jakarta

Jakarta Regexp 是一个 100% 纯 Java 正则表达式包

它没有维护,但最后一个版本不是那么旧(2011 年)。

文档:http://jakarta.apache.org/regexp/

对于 replaceAll,您可以使用 substREPLACE_ALL 标志。

PS:链接失效了,here a mirror to download the lib

【讨论】:

  • 确定现代库与 1.3 兼容吗? :-)
  • 我的猜测是这个库可能在后台使用replaceAll
  • 更不用说在网站顶部它说它已经退役两年多了。
【解决方案4】:

假设您只需要将字母和其他任何内容替换为空白。 Character 也得到了 isDigit 方法。如果有帮助,请参考http://docs.oracle.com/javase/1.3/docs/api/java/lang/Character.html

public static void main (String[] args)
{


String yourstring = "2323ABF!@CD24";
char[] check = yourstring.toCharArray();
StringBuffer str = new StringBuffer();
for(int i=0; i < check.length; i++){
    if(!Character.isLetter(check[i])){
       str.append("");
    }
    else{
        str.append(check[i]);
    }
}
System.out.println(str.toString());
}

【讨论】:

  • 我相信这是最好的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
相关资源
最近更新 更多