我需要从以下字符串中提取状态数据(NSW
,SA
):
55 Christie St, St Leonards NSW, Australia
338-340 Tapleys Hill Rd, Seaton SA, Australia
Kincumber South NSW, Australia
为此,我编写了正则表达式.*(\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
。
我应该如何更改正则表达式和/或代码,以便从SA
和338-340 Tapleys Hill Rd, Seaton SA, Australia
中从其他两个字符串中提取NSW
?
答案 0 :(得分:2)
您需要使用非贪婪量词.*
关注?
,并在角色等级之前删除\w
。同时删除您的范围?
后的{2,3}
量词,根本不需要。
.*?([A-Z]{2,3}),.*
我建议使用字符串^
锚点的开头,也可以使用单词边界\b
。
^.*?(\b[A-Z]{2,3}),.*
答案 1 :(得分:1)
答案 2 :(得分:0)
答案 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个字符的大写单词(如果需要,可以更改限制)
,
匹配角色,字面意思为
[^,]+
匹配一个或多个不包含逗号的字符