我正在尝试使用正则表达式来指定模式,但是替换时也会替换所需的字符。在这种情况下,指定边界没有帮助。
String name = "Dr.Dre" ;
Pattern p = Pattern.compile("(Mr.|MR.|Dr.|mr.|DR.|dr.|ms.|Ms.|MS.|Miss.|Mrs.|mrs.|miss.|MR|mr|Mr|Dr|DR|dr|ms|Ms|MS|miss|Miss|Mrs|mrs)"+"\\b");
Matcher m = p.matcher(name);
StringBuffer sb = new StringBuffer();
String namef = m.replaceAll("");
System.out.println(namef);
输入:Dr.Dre或Dr. Dre或Dr. Dre
编辑:
感谢您的帮助,但我面临的正则表达式问题很少: 程序:
String name = "Dr. Dre" ;
Pattern p = Pattern.compile("(Mr\\.|MR\\.|Dr\\.|mr\\.|DR\\.|dr\\.|ms\\.|Ms\\.|MS\\.|Miss\\.|Mrs\\.|mrs\\.|miss\\.|MR|mr|Mr|Dr|DR|dr|ms|Ms|MS|miss|Miss|Mrs|mrs)"+"\\b");
Matcher m = p.matcher(name);
String namef = m.replaceAll("");
System.out.println(namef);
对于上述程序,我收到的输出为: 。德瑞 而期望的输出是: DRE
答案 0 :(得分:7)
正则表达式中的点表示"任何字符"。你需要使用反斜杠来转义它,反斜杠又需要在字符串文字中转义:
Pattern p = Pattern.compile("Mr\\.|MR\\.|Dr\\.|mr\\.|DR\\.|dr\\.|ms\\."); // etc
请注意,在删除" Dr。"之后,您将获得双倍空格。来自"或Dr. Dre"虽然...
编辑:出于某种原因(我还没有找到原因),点后面的空格不算作单词边界。如果您将模式更改为使用\\s
而不是\\b
,那么替换单个空白字符,它适用于" Dr。 DRE" - 但正如评论中所指出的那样,#Dr; DrDre"会失败。您可以完全删除单词边界并为模式的后面部分添加空格(" DR | Dr |"等)或使用(\\s|\\b)
适用于我尝试过的情况,但可能还有其他不良副作用。
答案 1 :(得分:2)
问题有点不清楚(你没有提供有问题的结果),但我的猜测是问题在于使用句号字符。这个时期在正则表达式中有意义 - 它匹配任何一个字符,所以“博士”实际上会匹配* Dr.D * re。你必须像“博士”那样逃避它或者在你的代码中,特别是逃避逃避斜杠,像这样:“Dr \。”
希望有所帮助!