replaceAll替换斜杠之前和之后的完整单词

时间:2015-04-13 08:22:16

标签: java regex replaceall

我需要更换一些特定的单词。

例如,如果我的文字有

He needs to have java skills

我需要将其替换为

He/She needs to have java skills

我用下面的代码实现了这个

String replacedText = originalText.replaceAll("\\bHe\\b|\\bShe\\b","He/She");

但问题是当我再次执行代码时,输​​出是

He/She/He/She needs to have java skills

问题是'\\b'即使在斜线之前或之后,也会考虑单词。

更新:我从word / excel / html文件中获取源代码。所以这是第一次工作正常。我的意图是如果我再次在修改过的文件上运行代码,它不应该改变任何东西。

如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

开始时几乎没有提示:

  1. he she可以代表s?he(其中s是可选的),因此您不需要he|she(它将事情缩短,同样简单。)

  2. 此外,您可以使用(?i)标记,这将使您的正则表达式不区分大小写。

  3. 现在考虑更换

    • he
    • she

    但也

    • he/she
    • she/he

    he/she。表示此案例的正则表达式看起来像s?he(/s?he)?

    请尝试使用

    replaceAll("(?i)\\bs?he(/s?he)?\\b","He/She");
    

答案 1 :(得分:1)

我借助负面前瞻和消极的外观来实现它。有了这个逻辑,我可以运行代码。对已经修改过的文件的次数。

private String replace(String originalText) {
    String replacedText = originalText.replaceAll(
            "\\b(he(?!/)|(?<!/)she)\\b", "he/she");
    replacedText = replacedText.replaceAll("\\b(He(?!/)|(?<!/)She)\\b",
            "He/She");
    replacedText = replacedText.replaceAll("\\b(his(?!/)|(?<!/)her)\\b",
            "his/her");
    replacedText = replacedText.replaceAll("\\b(His(?!/)|(?<!/)Her)\\b",
            "His/Her");
    replacedText = replacedText.replaceAll("\\bhim(?!/)\\b", "him/her");
    replacedText = replacedText.replaceAll("\\bHim(?!/)\\b", "Him/Her");
    return replacedText;
}

感谢Biffen的想法。

答案 2 :(得分:0)

一种简单的方法可能是

String[] originalTexts = {"He needs to have java skills",
    "She needs to have java skills",
    "He/She needs to have java skills"
};
for (String original : originalTexts) {
    String replacedText = original.replaceAll("\\b(She/He|He/She|He|She)\\b","He/She");
    System.out.printf("original: %-32s  replacedText: %20s%n", original, replacedText);
}