【问题标题】:Regular Expression to Capture First Two Lines That Don't Include String正则表达式捕获不包含字符串的前两行
【发布时间】:2019-04-16 08:57:59
【问题描述】:

我正在努力寻找一种方法来使用正则表达式提取地址的前两行,其中不包含单词“Account”。

如果我们采用这个地址:

公司名称
某路
某镇

我可以使用正则表达式(?:.*\s*){2}返回

公司名称某路

这很棒。

但是,如果顶部多出一行,则使地址变为:

应付账款
公司名称
Some Road
Some Town

然后它不再选择我想要的那两条线。

我已经尝试过这里的方法:Regular expression to match a line that doesn't contain a word?,但没有成功,也尝试过使用(?!Account.*)(?:.*\s*){3}之类的组合,但收效甚微。

Microsoft 网站https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference 有大量字符等可供使用,但我还没有设法使组合起作用。

我得到的最接近的是使用 [^Account.*](?:.*\s*){3} 返回

应付账款 公司名 某路

我只是无法删除该行的其余部分!任何帮助,将不胜感激。谢谢。

【问题讨论】:

  • 在多行模式下尝试^(?!Accounts)(?:.*\n?){2}^。如果它不是文本编辑器,请将(?m) 添加到正则表达式的开头。见regex101.com/r/1Ci5yD/1
  • 您在开头添加 (?m) 的答案已经完成了我所需要的!这是谜题中缺失的部分!将此作为答案,我会将其标记为已接受。谢谢。

标签: regex


【解决方案1】:

您可以使用^ 开启多行模式:

(?m)^(?!Accounts)(?:.*\n?){2}

或者(更高效并遵循最佳实践):

(?m)^(?!Accounts).*(?:\n.*)?

请参阅regex demothis regex demo

(?m) 添加到模式中时,^ 匹配行的开头,并且整个模式匹配

  • ^ - 行首
  • (?!Accounts) - 第一个字没有 Accounts
  • (?:.*\n?){2} - 出现两次除换行符以外的任何 0+ 字符,后跟可选换行符
  • .*(?:\n.*)? - 匹配一行和一个可选的后续行。

【讨论】:

  • 完美。感谢您的解释和链接。
猜你喜欢
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
  • 2012-05-11
  • 2011-06-27
  • 2017-05-10
  • 2012-08-20
相关资源
最近更新 更多