Java 我自己的正则表达式

Java 我自己的正则表达式,java,regex,Java,Regex,请我需要一些人来帮助我,我想用Drive-Road-and-Street替换像Dr、Rd和St这样的字符,使用正则表达式,请问这是怎么做到的?我试过很多方法,但我的结果不对。 例如,如果用户为变量vaddress提供此地址: 艾伦路皇后区克林顿街13号。 结果应该是 皇后大道艾伦路对开的克林顿街13号 以下是我的代码示例: public void standardizeAddress(String vaddress){ address = vaddress;//addre

请我需要一些人来帮助我,我想用Drive-Road-and-Street替换像Dr、Rd和St这样的字符,使用正则表达式,请问这是怎么做到的?我试过很多方法,但我的结果不对。 例如,如果用户为变量vaddress提供此地址: 艾伦路皇后区克林顿街13号。 结果应该是 皇后大道艾伦路对开的克林顿街13号

以下是我的代码示例:

    public void standardizeAddress(String vaddress){
        address = vaddress;//address is an instance variable
        String str1,str2;
       //Replace all instances of 'St,Rd,Dr' with 'Street,Road and Drive' Using

            String regex = "\\sSt\\s";
            Pattern pat = Pattern.compile(regex);
            Matcher match = pat.matcher(address);
            while(match.find())
             address = match.replaceAll(" Street ");
             System.out.println(address);
             str1 = address;

            regex = "\\sRd\\s";
            pat = Pattern.compile(regex);
            match = pat.matcher(str1);
            while(match.find())
            str1 = match.replaceAll(" Road ");
            System.out.println(str1);
            str2 = str1;

            regex = "\\sDr\\s";
            pat = Pattern.compile(regex);
            match = pat.matcher(str2);
            while(match.find())
            str2 = match.replaceAll(" Drive ");
            System.out.println(str2);    
        }
提前感谢您

这应该可以:

String str = "Dr abc Rd def St ghi";
str = str.replaceAll("(\\s+|^)Dr(\\s+|$)", "$1Drive$2");
str = str.replaceAll("(\\s+|^)Rd(\\s+|$)", "$1Road$2");
str = str.replaceAll("(\\s+|^)St(\\s+|$)", "$1Street$2");

System.out.println(str);
收益:

驾驶abc路def街ghi


这段代码应该在您要替换的单词之前保留空格。

我认为如果您的情况非常简单,并且您的场景很小(并且您不需要复杂的regexp),您可以简单地使用or。

如果您想使用Matcher,下面的代码示例将帮助您:)


输出结果:
街号9、街号99和街号999

仅显示图案和匹配器的用法。我认为简单的答案加上几个替换词是最具可读性的

    Map<String, String> replacements = new LinkedHashMap<>(); // Keep in order
    replacements.put("Dr", "Drive");
    replacements.put("Rd", "Road");
    replacements.put("St", "Street");

    StringBuilder regex = new StringBuilder();
    for (String abbrev : replacements.keySet()) {
        regex.append(regex.length() == 0? "\\b(" : "|");
        regex.append(Pattern.quote(abbrev));
    }
    regex.append(")\\b");
    Pattern abbrevPattern = Pattern.compile(regex.toString());
    Matcher m = abbrevPattern.matcher(vaddress);

    StringBuffer result = new StringBuffer();
    while (m.find()) {
        String outwritten = replacements.get(m.group(1));
        m.appendReplacement(result, outwritten);
    }
    m.appendTail(result);
    return result.toString();
Map replacements=newlinkedhashmap();//保持秩序
替换。放置(“Dr”、“驱动器”);
替换。放置(“Rd”、“道路”);
替换。放置(“街”、“街”);
StringBuilder正则表达式=新的StringBuilder();
for(字符串abbrev:replacements.keySet()){
regex.append(regex.length()==0?\\b(“:”);
regex.append(Pattern.quote(abbrev));
}
regex.append(“)\\b”);
Pattern abbrevPattern=Pattern.compile(regex.toString());
Matcher m=abbrevPattern.Matcher(vaddress);
StringBuffer结果=新的StringBuffer();
while(m.find()){
字符串outwrited=replacements.get(m.group(1));
m、 附录替换(结果,改写);
}
m、 附尾(结果);
返回result.toString();

输入是什么?你期望什么样的产出?您得到了什么输出?使用还是不够?对于如此简单的工作,如此复杂的代码。使用<代码> YouStreet。替换所有(“ST”,“街道”)< /COD>。您还需要考虑可以在<代码> DR < /C> >或<代码> RD>代码>之后的任何标点符号。当然,目前的问题中没有提到这一点。所以,可能这应该留给OP来操作正则表达式。否则一切都好+1
(\\s+|^)Dr(\\s+|$)
也可以替换为
\\bDr\\b
。然后换成
Drive
@RohitJain:虽然我同意你的说法,但我对这个问题缺乏背景知识。如果我有这样一个地址:Foo Barr博士,foo1Dr foo2Rd foo3St。在本例中,
Dr.
代表医生。@npinti。。没错。这就是为什么我说,应该让OP来解决。
    Map<String, String> replacements = new LinkedHashMap<>(); // Keep in order
    replacements.put("Dr", "Drive");
    replacements.put("Rd", "Road");
    replacements.put("St", "Street");

    StringBuilder regex = new StringBuilder();
    for (String abbrev : replacements.keySet()) {
        regex.append(regex.length() == 0? "\\b(" : "|");
        regex.append(Pattern.quote(abbrev));
    }
    regex.append(")\\b");
    Pattern abbrevPattern = Pattern.compile(regex.toString());
    Matcher m = abbrevPattern.matcher(vaddress);

    StringBuffer result = new StringBuffer();
    while (m.find()) {
        String outwritten = replacements.get(m.group(1));
        m.appendReplacement(result, outwritten);
    }
    m.appendTail(result);
    return result.toString();