这是我的正则表达式模式:
\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、代码和城镇。
但我没有找到正确的模式...
避免使用
[\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>.+)$
注意,我使用了命名组来方便地识别什么是什么。您可以删除它并使正则表达式更短。让我知道这是否适合您,我会根据您的需要添加解释。