Java 使用正则表达式删除模式中的首字母
我试图用正则表达式删除指定的模式,但作为替换,它也替换了想要的字符。在这种情况下,指定边界没有帮助Java 使用正则表达式删除模式中的首字母,java,regex,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.match
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
编辑:
感谢您的帮助,但我面临的正则表达式问题很少:
节目:
对于上述程序,我接收的输出为:
. 数据记录设备
而所需的输出是:
正则表达式中的点表示“任何字符”。您需要使用反斜杠对其进行转义,而反斜杠又需要以字符串文字进行转义:
Pattern p = Pattern.compile("Mr\\.|MR\\.|Dr\\.|mr\\.|DR\\.|dr\\.|ms\\."); // etc
请注意,从“Dr.”或“Dr.Dre”中删除“Dr.”之后,您将得到一个双空格
编辑:出于某种原因(我还没有弄清楚原因),点后的空格不算作单词边界。如果您将模式更改为使用
\\s
而不是\\b
,则替换单个空白字符,它适用于“Dr.Dre”-但如注释中所述,它随后对“Dr.Dre”无效。您可以完全删除单词边界,并在模式的后面部分添加一个空格(“DR | DR |”等),或者使用(\\s |\\b)
,这适用于我尝试过的情况,但可能有其他不希望的副作用。正则表达式中的点表示“任何字符”。您需要使用反斜杠对其进行转义,而反斜杠又需要以字符串文字进行转义:
Pattern p = Pattern.compile("Mr\\.|MR\\.|Dr\\.|mr\\.|DR\\.|dr\\.|ms\\."); // etc
请注意,从“Dr.”或“Dr.Dre”中删除“Dr.”之后,您将得到一个双空格
编辑:出于某种原因(我还没有弄清楚原因),点后的空格不算作单词边界。如果您将模式更改为使用
\\s
而不是\\b
,则替换单个空白字符,它适用于“Dr.Dre”-但如注释中所述,它随后对“Dr.Dre”无效。您可以完全删除单词边界,并在模式的后面部分添加一个空格(“DR | DR |”等),或者使用(\\s |\\b)
,这适用于我尝试过的情况,但可能会有其他不良副作用。问题有点不清楚(您没有提供有问题的结果),但我猜问题在于使用句点字符。句点在正则表达式中有一个含义-它匹配任何字符,因此“Dr.”实际上将匹配*Dr.D*re。你必须像“Dr”一样转义,或者在你的代码中,特别是转义斜杠,像这样:“Dr\”
希望有帮助 问题有点不清楚(您没有提供有问题的结果),但我猜问题在于使用句点字符。句点在正则表达式中有一个含义-它匹配任何字符,因此“Dr.”实际上将匹配*Dr.D*re。你必须像“Dr”一样转义,或者在你的代码中,特别是转义斜杠,像这样:“Dr\”
希望有帮助 @user595169:嗯,你的评论没有意义-你对工作和不工作都给出了相同的输入…对不起,更正一下:1。输入:Dr.Dre->输出:dre2。输入:Dr.Dre->输出:。Drefor输入为“Dr.DRE”,输出为“.DRE”@user595169:你真的不应该,我测试它时也没有。请展示一个简短但完整的程序来演示这一点-将其编辑到问题中。我期望“DRE”的输出。@user595169:那是因为模式中还有
“| MR | MR | MR | Dr | Dr | ms | ms | miss | miss | Mrs | Mrs”
。你需要让团队更贪婪地捕获-看看我能做些什么。@user595169:嗯,你的评论没有意义-你对工作和不工作都给出了相同的输入…对不起,更正一下:1。输入:Dr.Dre->输出:dre2。输入:Dr.Dre->输出:。Drefor输入为“Dr.DRE”,输出为“.DRE”@user595169:你真的不应该,我测试它时也没有。请展示一个简短但完整的程序来演示这一点-将其编辑到问题中。我期望“DRE”的输出。@user595169:那是因为模式中还有“| MR | MR | MR | Dr | Dr | ms | ms | miss | miss | Mrs | Mrs”
。你需要让团队更贪婪地捕捉,看看我能做些什么。