优雅的java字符串自定义替换解决方案

时间:2015-11-29 20:27:58

标签: java regex string

我解决了下面列出的问题,它工作正常,但看起来很笨重而且效率不高。我正在寻找改进它的方法,并获得更优雅的解决方案,任何建议我如何改进它?任何建议表示赞赏。谢谢!

问题: 给定一个字符串,返回一个字符串,其中小写单词"的每个外观都是"已被替换为"不是"。 "这个词是"不应该立即在一个字母之前或之后 - 例如"是"在"这"不算数。

试验:

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

5 个答案:

答案 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