java - 忽略大写/小写字符串

标签 java substring

我的目标是将句子中“java”一词的任何形式更改为“JAVA”。我已经完成了所有操作,但我的代码无法在混合大小写下读取,例如:JaVa、JAva 等。我知道我应该使用 toUpperCase 和 toLowerCase 或 equalsIgnoreCase 但我不确定如何正确使用它。我不允许使用replace或replace all,老师想要substring方法。

    Scanner input=new Scanner(System.in);
    System.out.println("Enter a sentence with words including java");
    String sentence=input.nextLine();

    String find="java";
    String replace="JAVA";
    String result="";
    int n;
    do{
        n=sentence.indexOf(find);
        if(n!=-1){
            result =sentence.substring(0,n);
            result=result +replace;
            result = result + sentence.substring(n+find.length());
            sentence=result;            
        }
    }while(n!=-1);
    System.out.println(sentence);
}

}

最佳答案

您不能使用 String.indexOf 来执行此操作,因为它区分大小写。

简单的解决方案是使用具有不区分大小写模式的正则表达式;例如

Pattern.compile(regex, Pattern.CASE_INSENSITIVE).matcher(str).replaceAll(repl);

这还有一个好处,可以避免您当前用于替换的困惑字符串攻击。


在您的示例中,您的输入字符串作为正则表达式也是有效的...因为它不包含任何正则表达式元字符。如果确实如此,那么简单的解决方法是使用 Pattern.quote(str) 它将元字符视为文字匹配。

String.replaceAll(...) 是一种用于对字符串进行正则表达式替换的“便捷方法”,这一点也毫无值(value),尽管您不能在示例中使用它,因为它区分大小写匹配。


郑重声明,这是通过字符串攻击完成这项工作的部分解决方案。 @ben - 这是供您阅读和理解的……而不是复制。故意取消注释是为了鼓励您仔细阅读。

// WARNING ... UNTESTED CODE
String input = ...
String target = ...
String replacement = ...
String inputLc = input.lowerCase();
String targetLc = target.lowerCase();
int pos = 0;
int pos2;
while ((pos2 = inputLc.indexOf(targetLc, pos)) != -1) {
    if (pos2 - pos > 0) {
        result += input.substring(pos, pos2);
    }
    result += replacement;
    pos = pos2 + target.length();
}
if (pos < input.length()) {
    result += input.substring(pos);
}

对于结果使用StringBuilder可能比使用String更有效。

关于java - 忽略大写/小写字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27240645/

相关文章:

julia - 在 Julia 中提取子字符串

javascript - jQuery:将 <span> 包裹在子字符串周围......关闭,但不完全

java - 使用带有实体字段的 Hibernate 查询

java - 使用仅一项的 java Streams 作为计算上下文 - 好不好?

Java子串条件结束

string - 使用 trie 进行字符串分割 - 时间复杂度?

java - java中过滤字符串

stub 上的 Java RMI ClassNotFoundException 发生在 Linux 而不是 Windows

java - 如何使用 Android 移动应用程序单击网页上的按钮

java - 我们如何检查对象值是否与 Java 中的基本类型字段兼容