1

我正在尝试按照使用 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,而所需的输出是:Dre

4

2 回答 2

7

正则表达式中的点表示“任何字符”。您需要使用反斜杠对其进行转义,而反斜杠又需要在字符串文字中进行转义:

Pattern p = Pattern.compile("Mr\\.|MR\\.|Dr\\.|mr\\.|DR\\.|dr\\.|ms\\."); // etc

请注意,删除“Dr.”后,您将得到一个双倍空格。虽然来自“或 Dr. Dre”...

编辑:出于某种原因(我还没有弄清楚为什么),点后的空格不算作单词边界。如果您将模式更改为使用\\s而不是\\b,则替换单个空格字符,它适用于“Dr. Dre” - 但如评论中所述,它会失败用于“Dr.Dre”。您可以完全删除单词边界并在模式的后面部分添加一个空格(“DR | Dr |”等),或者使用(\\s|\\b)适用于我尝试过的情况的空格,但很可能会有其他不良副作用。

于 2012-11-05T07:38:31.173 回答
2

问题有点不清楚(您没有提供有问题的结果),但我的猜测是问题在于使用句点字符。句点在正则表达式中是有意义的——它匹配任何字符,所以“博士”。实际上会匹配 * Dr.D *re。你必须像“博士”一样逃避它。或者特别是在您的代码中,转义转义斜杠,如下所示:“Dr\。”

希望有帮助!

于 2012-11-05T07:40:57.713 回答