我的正则表达式有问题。我必须读取包含联系人数据的文件并将其导入数据库。该行具有标准格式,我能够读取所有行,提取联系人姓名,街道/房屋,邮政编码和城市。我遇到的问题是,门牌号可以是数字或类似“ 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>[^\)]+)\))?$
这里是地址部分。
First Street 32 78224 firstCity
Second Street 7/9 73430 secondCity
Third Street 32 78224 third/City
Fourth Street 9/7 73430 fourth/city
第一个和第三个示例都可以。我可以读取数据。但是第二和第四返回空字符串。
有人可以帮我吗?
答案 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个以上水平空格字符(?<suffix>/\pL+)?
匹配可选的后缀$
字符串结尾在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