Java 正则表达式排除块地址中的一行

问题描述 投票:0回答:1

这是我的正则表达式模式:

\b(?!(?i)Doctor| )([^\s]*\b)[\n\r\s]+(\b[\S\s][^\d]*\b)[\s\S]+([0-9]{5})\s+([\D]*)

我需要检索块地址中的不同信息,例如:

Doctor John DOE
123 dream road 
12345 TOWN

Java代码:

firstName = matcher.group(1).trim();
lastName = matcher.group(2).trim();

效果很好!但有时会有额外的一行:

Doctor John DOE
Country Hospital
123 dream road 
12345 TOWN

名字被很好地检索到:“John” 但检索到的姓氏是“DOE Country Hospital”

理想的目标是在单独的字段中获取名字、姓氏、地址行 1(如果存在......)、地址行 2、代码和城镇。

但我没有找到正确的模式...

java regex matching
1个回答
0
投票

避免使用

[\s\S]
,如果您不想也捕获换行符,请使用
.
。使用
[\s\S]
会导致捕获
DOE Country Hospital
,因为
DOE
之后有一个换行符,并且
[\s\S]
将捕获该换行符,但
.
不会捕获,除非您使用
(?s)
修饰符,这使得
.
为也捕获换行符。

对于您帖子中的两个示例,其中地址的第一行是可选的,您可以使用以下正则表达式来捕获地址中的不同部分。我简化了您的正则表达式并使用

\R
来匹配换行符,因为
\R
几乎匹配各种操作系统中换行符的所有变体。

^(?:(?i)Doctor )?(?<FirstName>\S+)\s+(?<LastName>\S+)(?:\R(?<AddressLine1>.+))?\R(?:(?<AddressLine2>.+))\R(?<Code>\d{5})\s+(?<Town>.+)$

演示

注意,我使用了命名组来方便地识别什么是什么。您可以删除它并使正则表达式更短。让我知道这是否适合您,我会根据您的需要添加解释。

© www.soinside.com 2019 - 2024. All rights reserved.