【问题标题】:Match certain string on second line of text with regex使用正则表达式匹配第二行文本上的某些字符串
【发布时间】:2020-04-27 17:29:36
【问题描述】:

我是正则表达式的新手,希望得到一些指导/帮助。

目前,我正在寻找一个表达式,它从所提供文本的第二行派生出特定部分的文本。

这是正文:

123 随处大道 温尼伯,马尼托巴 R3E 0L7 加拿大 药房经理:人人 药房执照持有人/所有者:123456 Manitoba Ltd.

使用代码here查看正确的格式

我的目标是从第二行导出“Manitoba”字符串,但是我想让它成为动态的,而不是编写一个表达式来始终将 Manitoba 作为静态获取。我使用下面的代码来定位第二行:

(.*)(?=(\n.*){3}$)

(它匹配从最后一行开始的 3 行,从而定位所需的行)

我注意到,在数据集中,省(曼尼托巴省)总是位于两个空格之间。

我可以对代码进行任何添加,以便表达式仅针对第二行,然后匹配空格之间的第一个字符串?

也许使用带有正向环视的惰性表达式?

如果我以空格之间的所有匹配项为目标,则需要同时使用我不想要的“Manitoba”和“R3E 0L7”。

我希望它只匹配第二行空格之间的第一段文本。

非常感谢任何帮助:-)

谢谢。

【问题讨论】:

  • 试试^.*\r?\n\S+[^\S\r\n]+(\S+).*(?=(?:\n.*){3}$)regex101.com/r/Aiy2kl/1
  • @Thefourthbird 你能解释一下我是如何工作的吗?那将不胜感激。看起来确实有效。
  • 我已将其添加为带有解释的答案。

标签: regex regex-lookarounds regex-group


【解决方案1】:

一个选项可以是匹配第一行,然后在捕获 group 1 中捕获第二行中的第二个单词。

然后匹配第二行的其余部分,并断言后面的内容是一行 3 次。

^.*\r?\n\S+[^\S\r\n]+(\S+).*(?=(?:\r?\n.*){3}$)

部分:

  • ^ 字符串开始
  • .*\r?\n匹配整行和换行
  • \S+ 匹配 1+ 非空白字符(第一个“单词”)
  • [^\S\r\n]+ 匹配 1+ 次空格字符,换行符除外
  • (\S+) 捕获 group 1 匹配 1+ 次非空白字符(第二个“单词”)
  • .* 匹配该行的其余部分
  • (?= 正向前瞻,断言右边的内容是
    • (?:\r?\n.*){3}$ 匹配 3 次换行符,后跟 0+ 次除换行符以外的任何内容,并断言字符串的结尾
  • )关闭前瞻

Regex demo

您也可以将前瞻改为匹配

^.*\r?\n\S+[^\S\r\n]+(\S+).*(?:\r?\n.*){3}$

Regex demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    相关资源
    最近更新 更多