【问题标题】:Regular Expression to find “lastname firstname”正则表达式查找“​​姓氏名字”
【发布时间】:2016-01-01 09:24:12
【问题描述】:

我们有一个文件,其中仅包含姓氏、空格和名字。

文件如下所示:

Alex Roni
ToMmy Rid
Christian Olav
JohHn PeTter
Flara Sbastian
Hovard Kai
Runne Nervin
OlaAf RoOni
Olaf Roni

我们想用 4 种方式 grep 这个文件。

首先,我们希望找到以 N、O、P、Q、R 开头的任何姓氏。

我写了以下代码:

(^[N-R]) 

第二次发现名字和姓氏的长度都正好是 4 个字母。

我编写以下代码。但似乎不起作用。它必须 grep Olaf Roni

(^[N-R]{4}+)([N-R]{4}+)

第三个名字和姓氏不包含s。是否正确,也有效。

^[^s]*$

第四次查找姓氏包含两个大字符,如MacDonald。第二个大字符可以出现在名称中的任何位置。

这段代码也不行。

^(.*?[A-Z]{2,}.*)+(.*?[A-Z]{2,}.*)$

【问题讨论】:

  • [N-R]{4}+ 不会像您认为的那样做。看起来你应该从阅读正则表达式教程开始。
  • 你说得对,返回null。
  • 家庭作业,有机会吗?
  • 我希望你永远不会有“José Manuel de las Heras”或类似的东西;-)

标签: regex grep


【解决方案1】:

您可以使用前瞻:

^(?=\w{4}\s\w{4}$)[N-R].*

Demo


/[NR]/ 的正则表达式仅匹配 N、O、P、Q、R 范围内的一个字符。如果您使用 [NR]{4},则表示您要匹配同一范围内的 4 个字符范围,例如 NNNN 将是一个匹配项。

对于您描述的名称,您会想要:

[N-R][a-zA-Z]{3}

 ^^^              One letter in the range N-R
       ^^^        an ASCII letter
              ^^  proceeding match 3 times

因此,符合该模式并用空格分隔的两个名称将是:

^[N-R][a-zA-Z]{3} [N-R][a-zA-Z]{3}$

Demo

然后,您可以为您描述的其他约束添加额外的前瞻。在 RexEgg HERE. 有一篇关于正则表达式前瞻的精彩文章

【讨论】:

  • 太棒了。您可以添加具有更多前瞻的其他条件。如果有效,请accept the answer
  • 这段代码(^[N-R]) greps 任何以 N 和 R 开头的姓氏,但我们如何才能只为 N 和 R 之间的名字做同样的工作。
  • 您可以使用^[N-R]\w{3}\s[N-R]\w{3}$^(?=[N-R]\w{3}\s[N-R]\w{3}$).* 之类的内容进行前瞻。
【解决方案2】:

试试这个:

.* (.*[A-Z].*[A-Z].*)

http://rubular.com/r/wuWMKFJlir

【讨论】:

    【解决方案3】:

    下面是表达式

    ^(([N-R][\w]{3}(\s?)){2})$

    演示:

    https://regex101.com/r/wM2oE4/9

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多