java - 为什么我的正则表达式在 Java 中不起作用

标签 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 获取地址,并且对所提供的数据没有任何影响。顺便说一下,这里提供的地址是一个错误地址的示例。我也必须处理这些。

最佳答案

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

固定的正则表达式是

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

enter image description here

详细信息:

  • ^ - 字符串开头(在 matches() 中不需要) -([^0-9]+?) - 第 1 组:一个或多个数字以外的字符,但尽可能少
  • \\s* - 0+ 个空格
  • ([0-9]+) - 第 2 组捕获 1+ 位数字
  • [\\W_]+ - 1 个或多个非单词字符或 _
  • ([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]

关于java - 为什么我的正则表达式在 Java 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40398156/

相关文章:

c# - 在文本文件上使用正则表达式的最佳方式是什么?

java - 从包含内容的字符串中删除 HTML 标签

java - 如何使用循环来创建新对象?

java - 如何以编程方式终止 Apache Storm 拓扑?

java - SPRING 问题 创建名为 'webSecurityConfig' : Unsatisfied dependency 的 bean 时出错

regex - 将多个匹配项返回到单个单元格中的 Excel VBA Regex 函数

python - 如何使用正则表达式将这个字符串分成两部分?

java - 正则表达式分组和匹配

java - 包内所有方法的@AspectJ 切入点

java - 使用 SwingUtilities.invokeLater() 在线程中加载 GUI 有哪些优点