我必须匹配自定义(德国)地址字符串才能获得街道,房屋号码,邮政编码和城市。我有一个正则表达式,适用于RegExr和Java Visual Regex Tester。
这是正则表达式(交付但可编辑):
^([^0-9]+)([0-9]+.*?)?(?:\w)?([0-9]{5})(?:\w)?(.*)$
这是字符串:
NEUE BÜHNE Senftenberg, Theaterpassage 1, 01968 Senftenberg
这是我的代码:
String regex = "^([^0-9]+)([0-9]+\\.*?)?(?:\\w)?([0-9]{5})(?:\\w)?(\\.*)$";
String address = "NEUE BÜHNE Senftenberg, Theaterpassage 1, 01968 Senftenberg";
Pattern pattern = Pattern.compile(regex);
String[] addrFromRegex;
// gives an array (length 1) with [0] == address
addrFromRegex = address.split(regex);
// gives an array (length 1) with [0] == address
addrFromRegex = pattern.split(address);
对于split(),问题可能是错误的转义。但对于模式,我认为我不必关心这个。我做错了什么?
更新
字符串中的,并不总是给出。其他可能的地址字符串是:
NEUE BÜHNE Senftenberg; Theaterpassage 1; 01968 Senftenberg
NEUE BÜHNE Senftenberg Theaterpassage 1 01968 Senftenberg
NEUE BÜHNE Senftenberg|Theaterpassage|1|01968|Senftenberg
NEUE BÜHNE Senftenberg|Theaterpassage_1_01968_Senftenberg
...
我通过XML获取地址,对所提供的数据没有任何影响。顺便说一句,这里提供的地址是一个错误的例子。我也必须处理这些问题。
答案 0 :(得分:2)
重点是你的模式意味着匹配你拥有的字符串。因此,您需要使用split
而不是Pattern#matches()
,并将捕获的值收集到列表/数组/等中。
固定的正则表达式是
"^([^0-9]+?)\\s*([0-9]+)[\\W_]+([0-9]{5})\\s*(.*)$"
<强>详情:
^
- 字符串的开头(matches()
中不需要)
- ([^0-9]+?)
- 第1组:除数字以外的一个或多个字符,但尽可能少\\s*
- 0+ whitespaces ([0-9]+)
- 第2组捕获1+位数[\\W_]+
- 一个或多个非字词或_
([0-9]{5})
- 第3组捕获5位数字\\s*
- 零个或多个空格(.*)
- 第4组捕获行的其余部分 $
- 字符串结尾(matches()
中没有必要)。List<String> lst = new ArrayList<>();
String s = "NEUE BÜHNE Senftenberg, Theaterpassage 1, 01968 Senftenberg";
Pattern pattern = Pattern.compile("([^0-9]+?)\\s*([0-9]+)[\\W_]+([0-9]{5})\\s*(.*)");
Matcher matcher = pattern.matcher(s);
if (matcher.matches()){
lst.add(matcher.group(1));
lst.add(matcher.group(2));
lst.add(matcher.group(3));
lst.add(matcher.group(4));
}
System.out.println(lst); // => [NEUE BÜHNE Senftenberg, Theaterpassage, 1, 01968, Senftenberg]
答案 1 :(得分:1)
您可以从以下代码开始:
String regex =
"^([\\p{L}\\s]+)(?:[,\\s]+)([\\p{L}\\s]+[0-9]+)(?:[,\\s]+)([0-9]{5}[\\p{L}\\s]+)$";
String address = "NEUE BÜHNE Senftenberg, Theaterpassage 1, 01968 Senftenberg";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(address);
matcher.matches();
System.out.println(matcher.group(1) + ":" + matcher.group(2) + ":" + matcher.group(3));
答案 2 :(得分:0)
我认为您需要使用正则表达式更改您的方法,我认为您的代码是检查地址是否匹配,如果为true则获取此地址。
溢出:
String source = "foo,bar" ;
String[] result = source.split(","); // you will get {"foo","bar"}
如果您想要检查正则表达式,则应使用匹配:
// check if the address is matched with your regex
boolean isMathed= address.matches(regex);
// if matched set result variable with address
addrFromRegex = (isMatched ? address : null);