我的目标是将句子中“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);
}
}
答案 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);
修改强>
根据您的评论,如果您需要使用子字符串方法,这是一种方法。
首先,由于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);
您可以使用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男子