正则表达式组不适用于多个地址

时间:2019-07-05 15:06:40

标签: java regex regex-group

我的正则表达式有问题。我必须读取包含联系人数据的文件并将其导入数据库。该行具有标准格式,我能够读取所有行,提取联系人姓名,街道/房屋,邮政编码和城市。我遇到的问题是,门牌号可以是数字或类似“ 7/9”的数字。

因为我的正则表达式只期望数字,所以第二个替代项的导入不起作用,导致斜杠。另一个问题是,当城市名称由两部分组成时,城市也可以有一个斜线。

String addressPattern = "^" 
                      + "(?<street>(?:\\p{L}| |\\d|\\.|-)+?) "
                      + "(?<number>\\d+(?: ?- \\// ?\\d+)? *[a-zA-Z]?) "
                      + "(?<zip>\\d{5}) "
                      + "(?<city>(?:\\p{L}| |-)+)"
                      + "(?: *\\((?<suffix>[^\\)]+)\\))?" + "$";

正则表达式:^(?<street>(?:\p{L}| |\d|\.|-)+?) (?<number>\d+(?: ?- ?\d+)? *[a-zA-Z]?) (?<zip>\d{5}) (?<city>(?:\p{L}| |-)+)(?: *\((?<suffix>[^\)]+)\))?$

这里是地址部分。

  1. First Street 32 78224 firstCity
  2. Second Street 7/9 73430 secondCity
  3. Third Street 32 78224 third/City
  4. Fourth Street 9/7 73430 fourth/city

第一个和第三个示例都可以。我可以读取数据。但是第二和第四返回空字符串。

有人可以帮我吗?

2 个答案:

答案 0 :(得分:1)

您可以使用可选组:

^(?<street>[\pL\pN.]+(?:\h+[\pL\pN.]+)*)\h+(?<number>\d+(?:/\d+)?)\h+(?<zip>\d{5})\h+(?<city>\pL+)(?<suffix>/\pL+)?$

关于图案

  • ^字符串的开头
  • (?<street>
    • [\pL\pN.]+匹配1次以上列出的任何游戏
    • (?:非捕获组
      • \h+[\pL\pN.]+匹配1次以上列出的任何游戏
    • )*关闭非捕获组并重复0次以上
  • )\h+关闭街道组,匹配1个以上水平空白字符
  • (?<number>
    • \d+(?:/\d+)?将1个以上的数字与可选的/数字部分匹配
  • )\h+关闭数字组,匹配1个以上水平空格字符
  • (?<zip>
    • \d{5}匹配5位数字
  • )\h+关闭zip组,匹配1个以上水平空格字符
  • `(?\ pL +)匹配城市
  • (?<suffix>/\pL+)?匹配可选的后缀
  • $字符串结尾

Regex demo | Java demo

在Java中

String regex = "^(?<street>[\\pL\\pN.]+(?:\\h+[\\pL\\pN.]+)*)\\h+(?<number>\\d+(?:/\\d+)?)\\h+(?<zip>\\d{5})\\h+(?<city>\\pL+)(?<suffix>/\\pL+)?$";

答案 1 :(得分:0)

我会看到一个更简单的正则表达式:^(?<street>\D*)\s(?<number>[\d\/]+)\s(?<zip>\d{5})\s(?<city>.*)$

  • street是除数字之外的任何数字
  • number是数字/斜杠
  • zip是5位数字
  • city是剩下的

这与您的4个字符串非常匹配:regex demo