使用正则表达式来削减模式中的首字母

时间:2012-11-05 07:36:35

标签: java regex

我正在尝试使用正则表达式来指定模式,但是替换时也会替换所需的字符。在这种情况下,指定边界没有帮助。

 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

>输出(预期):Dre或Dre或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

2 个答案:

答案 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 \。”

希望有所帮助!