我解决了下面列出的问题,它工作正常,但看起来很笨重而且效率不高。我正在寻找改进它的方法,并获得更优雅的解决方案,任何建议我如何改进它?任何建议表示赞赏。谢谢!
问题: 给定一个字符串,返回一个字符串,其中小写单词"的每个外观都是"已被替换为"不是"。 "这个词是"不应该立即在一个字母之前或之后 - 例如"是"在"这"不算数。
试验:
notReplace("is test") → "is not test"
notReplace("is-is") → "is not-is not"
notReplace("This is right") → "This is not right"
notReplace("This is isabell") → "This is not isabell"
notReplace("")→ ""
notReplace("is") → "is not"
notReplace("isis") → "isis"
notReplace("Dis is bliss is") → "Dis is not bliss is not"
notReplace("is his") → "is not his"
notReplace("xis yis") → "xis yis"
notReplace("AAAis is") → "AAAis is not"
我的解决方案:
public static String notReplace(String str) {
String result="";
int begin = 0;
if (str.equals("is"))
return "is not";
int index = str.indexOf("is");
if (index==-1)
return str;
while (index>-1){
if (index+begin==0 && !Character.isLetter(str.charAt(index+2))){
result += "is not";
begin = index+2;
index = str.substring(begin).indexOf("is");
}
else if (index+begin==0 && Character.isLetter(str.charAt(index+2))){
result += str.substring(begin,begin+index)+"is";
begin += index+2;
index = str.substring(begin).indexOf("is");
}
else if (index+begin == str.length()-2 && !Character.isLetter(str.charAt(index+begin-1))){
result += str.substring(begin, begin+index)+"is not";
return result;
}
else if(!Character.isLetter(str.charAt(index+begin-1))&&!Character.isLetter(str.charAt(index+begin+2))){
result += str.substring(begin,begin+index)+"is not";
begin += index+2;
index = str.substring(begin).indexOf("is");
}
else {
result += str.substring(begin,begin+index)+"is";
begin += index+2;
index = str.substring(begin).indexOf("is");
}
}
result += str.substring(begin);
return result;
}
答案 0 :(得分:3)
此解决方案适用于大多数示例:
public String notReplace(String str) {
// Add surrounding whitespace in case of an "is" at the beginning or end
str = " " + str + " ";
// Do replacement
String result = str.replaceAll(" is ", " is not ");
// Other replacements...
// result = result.replaceAll("", "");
return result.trim(); // Remove added whitespaces again using trim()
}
对于未被此代码替换的示例,您需要添加一些额外的代码行。或者查看正则表达式 - 正如still_learning所说。
希望这有帮助。
答案 1 :(得分:2)
您应该使用Pattern.compile
,然后使用replaceAll
。我试着写regex
,但我失败了。
所以你应该这样做:
class Replacer {
static Pattern isPattern = Pattern.compile("...(is)..."); // here you have to figure out the right pattern
public static String notReplace(String input) {
return isPattern.matcher(input).replaceAll("is not");
}
}
我认为这是最干净的解决方案,也比每次编译input.replaceAll
的{{1}}快得多。
作为一个正则表达式,你可能应该使用Pattern
<强>更新强>
您必须使用所谓的字边界唱[^\\p{Alphanum}](is)[^\\p{Alphanum]
,因此表达式应如下所示:\b
并且通过所有测试: - )
答案 2 :(得分:0)
您可以使用正则表达式。以下内容将返回您在示例中指定的内容:
str.replaceAll("([^a-zA-Z]|^)is([^a-zA-Z]|$)", "$1is not$2");
答案 3 :(得分:0)
@ k0ner的帮助找到了一个解决方案:
public String notReplace(String str) {
return str.replaceAll("\\bis\\b","is not");
}
答案 4 :(得分:0)
你的例子中的所有给定的单词都可以安排这个答案,如果你得到像&#34;这不是isabell是&#34; 那么只有最后的 &#34;&#34; 将被替换为&#34;&#34; 与&#34;不是&#34;
String ss = word.replaceAll("\\bis\\b(?!=*.not\\b)", "is not");
示例link