为什么我的正则表达式不适用于Java

时间:2016-11-03 09:39:42

标签: java regex

我必须匹配自定义(德国)地址字符串才能获得街道,房屋号码,邮政编码和城市。我有一个正则表达式,适用于RegExrJava 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获取地址,对所提供的数据没有任何影响。顺便说一句,这里提供的地址是一个错误的例子。我也必须处理这些问题。

3 个答案:

答案 0 :(得分:2)

重点是你的模式意味着匹配你拥有的字符串。因此,您需要使用split而不是Pattern#matches(),并将捕获的值收集到列表/数组/等中。

固定的正则表达式是

"^([^0-9]+?)\\s*([0-9]+)[\\W_]+([0-9]{5})\\s*(.*)$"

enter image description here

<强>详情:

  • ^ - 字符串的开头(matches()中不需要) - ([^0-9]+?) - 第1组:除数字以外的一个或多个字符,但尽可能少
  • \\s* - 0+ whitespaces
  • ([0-9]+) - 第2组捕获1+位数
  • [\\W_]+ - 一个或多个非字词或_
  • 的字符
  • ([0-9]{5}) - 第3组捕获5位数字
  • \\s* - 零个或多个空格
  • (.*) - 第4组捕获行的其余部分
  • $ - 字符串结尾(matches()中没有必要)。

Java demo

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);