如何编写正则表达式来提取2-3个字母澳大利亚州的缩写?

时间:2014-06-20 13:46:03

标签: java regex

我需要从以下字符串中提取状态数据(NSWSA):

  1. 55 Christie St, St Leonards NSW, Australia
  2. 338-340 Tapleys Hill Rd, Seaton SA, Australia
  3. Kincumber South NSW, Australia
  4. 为此,我编写了正则表达式.*(\w[A-Z]{2,3}?),.*,我使用下面的代码调用它。

    private final Pattern statePattern;
    
    statePattern = Pattern.compile(aStatePattern, Pattern.DOTALL);
    
    private String extractText(final String aAddress, final Pattern aPattern) {
        final Matcher matcher = aPattern.matcher(aAddress);
    
        if (matcher.matches())
        {
            return matcher.group(1).trim();
        }
        return "";
    }
    

    这个正则表达式适用于三个字符串中的两个,但无法从SA中提取338-340 Tapleys Hill Rd, Seaton SA, Australia

    我应该如何更改正则表达式和/或代码,以便从SA338-340 Tapleys Hill Rd, Seaton SA, Australia中从其他两个字符串中提取NSW

5 个答案:

答案 0 :(得分:2)

您需要使用非贪婪量词.*关注?,并在角色等级之前删除\w。同时删除您的范围?后的{2,3}量词,根本不需要。

.*?([A-Z]{2,3}),.*

Live Demo

我建议使用字符串^锚点的开头,也可以使用单词边界\b

^.*?(\b[A-Z]{2,3}),.*

答案 1 :(得分:1)

积极向前看应该符合您的需求:

[A-Z]+(?=, Australia$)

Regular expression visualization

Debuggex Demo


请注意,例如,允许使用空格可以改善这一点。

答案 2 :(得分:0)

以下正则表达式将提取字符串, Australia

之前的大写字母字母
\s([A-Z]+),\s\w+$

通过在最后提供$符号,它将匹配最后一个。我们不需要从头开始匹配。

DEMO

答案 3 :(得分:0)

我只想查找大写的字符类,后跟逗号,如下:

String[] inputs = { "55 Christie St, St Leonards NSW, Australia",
                "338-340 Tapleys Hill Rd, Seaton SA, Australia", "Kincumber South NSW, Australia" };
Pattern p = Pattern.compile("[A-Z]{2,3}(?=,)");
Matcher m;
for (String input: inputs) {
    m = p.matcher(input);
    // use a while loop if you happen to expect more than one match per input String
    if (m.find()) {
        System.out.printf("Found: \"%s\"%n", m.group());
    }
}

<强>输出

Found: "NSW"
Found: "SA"
Found: "NSW"

答案 4 :(得分:0)

试试这个正则表达式:

^.*(\b[A-Z]{2,3}),[^,]+$

<强> Live demo

^
开头 .*匹配任何字符零次或多次
\b[A-Z]{2,3}匹配2到3个字符的大写单词(如果需要,可以更改限制)
,匹配角色,字面意思为 [^,]+匹配一个或多个不包含逗号的字符