忽略大写/小写字符串

时间:2014-12-02 01:56:16

标签: java substring

我的目标是将句子中“java”这个词的任何形式改为“JAVA”。我已经完成了所有工作,但我的代码不会在混合的情况下读取,例如:JaVa,JAva等。我知道我想使用toUpperCase和toLowerCase或equalsIgnoreCase但我不确定如何正确使用它。我不允许使用替换或替换所有,老师想要子串方法。

    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);
}

}

3 个答案:

答案 0 :(得分:4)

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

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

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

这样做的好处是可以避免当前用来替换的麻烦的字符串抨击。


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

对于在字符串上进行正则表达式替换,String.replaceAll(...)是一种“便捷方法”也是值得的,尽管你不能将它用于你的例子,因为它会进行区分大小写的匹配。


对于记录,这是一个部分解决方案,通过字符串抨击来完成工作。 @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代替result可能更有效。

答案 1 :(得分:0)

快速解决方案是完全删除do/while循环,只使用不区分大小写的正则表达式String.replaceAll(),如:

sentence = sentence.replaceAll("(?i)java", "JAVA");
System.out.println(sentence);

或者,更一般,根据您的变量命名:

sentence = sentence.replaceAll("(?i)" + find, replace);
System.out.println(sentence);

Sample Program

修改

根据您的评论,如果您需要使用子字符串方法,这是一种方法。

首先,由于String.indexOf执行区分大小写的比较,您可以编写自己的不区分大小写的方法,让我们将其称为indexOfIgnoreCase()。这种方法看起来像:

// Find the index of the first occurrence of the String find within the String str, starting from start index
// Return -1 if no match is found
int indexOfIgnoreCase(String str, String find, int start) {
    for(int i = start; i < str.length(); i++) {
        if(str.substring(i, i + find.length()).equalsIgnoreCase(find)) {
            return i;
        }
    }
    return -1;
}

然后,您可以按以下方式使用此方法。

你找到你需要的单词的索引,然后你把这个单词之前的字符串部分(直到找到的索引)添加到结果中,然后你添加你找到的单词的替换版本,然后你添加找到单词后的其余字符串。

最后,您将根据找到的单词的长度更新起始搜索索引。

String find = "java";
String replace = "JAVA";
int index = 0;
while(index + find.length() <= sentence.length()) {
    index = indexOfIgnoreCase(sentence, find, index);       // use the custom indexOf method here
    if(index == -1) {
        break;
    }
    sentence = sentence.substring(0, index) +               // copy the string up to the found word
               replace +                                    // replace the found word
               sentence.substring(index + find.length());   // copy the remaining part of the string
    index += find.length();
}
System.out.println(sentence);

Sample Program

您可以使用StringBuilder来提高效率,因为+运算符会在每个连接上创建新的字符串。 Read more here

此外,您可以将indexOfIgnoreCase中的逻辑与其余代码组合在一起,例如:

String find = "java";
String replace = "JAVA";
StringBuilder sb = new StringBuilder();
int i = 0;
while(i + find.length() <= sentence.length()) {
    // if found a match, add the replacement and update the index accordingly
    if(sentence.substring(i, i + find.length()).equalsIgnoreCase(find)) {
        sb.append(replace);
        i += find.length();
    } 
    // otherwise add the current character and update the index accordingly
    else {
        sb.append(sentence.charAt(i));
        i++;
    }
}
sb.append(sentence.substring(i)); // append the rest of the string
sentence = sb.toString();
System.out.println(sentence);

答案 2 :(得分:0)

您可以使用toUpperCase()吗?试试这个

 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="";

    result = sentence.toLowerCase();
    result = result.replace(find,replace);
    System.out.println(result);
}

回复结果:))

更新:基于

  

我已经完成了所有工作,但我的代码不会在混合的情况下读取   例如:JaVa,JAva等

您可以使用您的代码

   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{
        //for you to ignore(converts the sentence to lowercase) either lower or upper case in your sentence then do the nxt process
        sentence = sentence.toLowerCase();

        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);
}

更新2:我在循环外部放置了LowCase Convertion。

public static void main(String[] args){

            String sentence = "Hello my name is JAva im a jaVa Man with a jAvA java Ice cream";
            String find="java";
            String replace="JAVA";
            String result="";
            int n;
            //for you to ignore(converts the sentence to lowercase) either lower or upper case in your sentence then do the nxt process
            sentence = sentence.toLowerCase();
            System.out.println(sentence);

            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);
    }

<强> RESULT

  

你好,我的名字是java,一个带java java冰淇淋的java男人

     

你好,我的名字是JAVA,是一个带有JAVA JAVA冰淇淋的JAVA男子