我必须匹配自定义(德语)地址字符串才能获取街道、门牌号、邮政编码和城市。我有一个正则表达式,它适用于 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 获取地址,并且对所提供的数据没有任何影响。顺便说一下,这里提供的地址是一个错误地址的示例。我也必须处理这些。
最佳答案
要点是您的模式旨在匹配您拥有的字符串。因此,您需要使用 Pattern#matches()
并将捕获的值收集到列表/数组/等中,而不是 split
。
固定的正则表达式是
"^([^0-9]+?)\\s*([0-9]+)[\\W_]+([0-9]{5})\\s*(.*)$"
详细信息:
^
- 字符串开头(在matches()
中不需要) -([^0-9]+?)
- 第 1 组:一个或多个数字以外的字符,但尽可能少\\s*
- 0+ 个空格([0-9]+)
- 第 2 组捕获 1+ 位数字[\\W_]+
- 1 个或多个非单词字符或_
([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]
关于java - 为什么我的正则表达式在 Java 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40398156/