首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用正则表达式匹配多个地址线?

如何使用正则表达式匹配多个地址线?
EN

Stack Overflow用户
提问于 2016-03-08 21:14:21
回答 2查看 267关注 0票数 0

给定以下示例文本,我是否可以使用正则表达式来匹配每个地址的每一行,并添加标记以了解一个地址何时结束,下一个地址何时开始?目前,我知道如何匹配每个完整的地址。然后,我可以运行第二个正则表达式来挑选单独的行,但是可以一次完成这两个步骤吗?

代码语言:javascript
运行
复制
Address:
Address 1 line 1,
Address 1 line 2,
Address 1 line 3

Address:
Address 2 line 1,
Address 2 line 2,
Address 2 line 3,
Address 2 line 4

Address:
Address 3 line 1,
Address 3 line 2
EN

回答 2

Stack Overflow用户

发布于 2016-03-08 21:19:49

下面是一个启用了DOTALL标志的Pattern,可以使用"Address:"字符串作为分隔符,通过多行进行查找:

代码语言:javascript
运行
复制
// for test
String addresses = "Address:" + System.getProperty("line.separator")
        + "Address 1 line 1," + System.getProperty("line.separator")
        + "Address 1 line 2," + System.getProperty("line.separator")
        + "Address 1 line 3"
        + "Address:" + System.getProperty("line.separator")
        + "Address 2 line 1," + System.getProperty("line.separator")
        + "Address 2 line 2," + System.getProperty("line.separator")
        + "Address 2 line 3";
//                           | look behind for "Address:"
//                           |            | any 1+ character, 
//                           |            | reluctantly quantified
//                           |            |  | lookahead for "Address:"
//                           |            |  | or end of input
//                           |            |  |            | dot can mean
//                           |            |  |            | line separator
Pattern p = Pattern.compile("(?<=Address:).+?(?=Address:|$)", Pattern.DOTALL);
Matcher m = p.matcher(addresses);
// iterating matches within given string, and printing
while (m.find()) {
    System.out.printf("Found: %s%n%n", m.group());
}

输出

代码语言:javascript
运行
复制
Found: 
Address 1 line 1,
Address 1 line 2,
Address 1 line 3

Found: 
Address 2 line 1,
Address 2 line 2,
Address 2 line 3

便笺

为了从匹配中排除"Address:"标记后面的行分隔符,您可以使用以下改进的模式:

代码语言:javascript
运行
复制
Pattern p = Pattern.compile("(?<=Address:"
    + System.getProperty("line.separator")+").+?(?=Address:"
    + System.getProperty("line.separator")+"|$)", 
    Pattern.DOTALL
);
票数 1
EN

Stack Overflow用户

发布于 2016-03-08 21:24:26

如果你想要正则表达式...

如果地址中的行数有限(在示例4中),则可以使用以下命令获取它们:

代码语言:javascript
运行
复制
Address:\s*?(?:\n(.*),)?(?:\n(.*),)?(?:\n(.*),)?(?:\n(.*),)?(?:\n(.*))

在这里,文本Address:标记块的开始,四行被抓取,前三行是可选的。

(您将需要全局标志。)

regex101 example

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35868417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档