【问题标题】:Regex To Find Names in All Caps正则表达式查找全部大写的名称
【发布时间】:2013-09-21 15:58:07
【问题描述】:

我正在尝试提出一个正则表达式,我可以使用它在 txt 文件中使用 Notepad++ 或类似工具查找包含全部大写名称的行。一旦找到匹配的行,我想添加三个换行符。

我有各种条件,因为这些行是名称。有些名字只有两个字符。有些有连字符。有些有多个名称。有些人的姓氏和逗号后没有空格。以下是一些示例:

  • 能源部,约翰 L
  • DOE-SMITH, JOHN L
  • DO,JO L
  • 能源部,约翰·鲍勃·L
  • 能源部,约翰·L

我也可以在其他程序中运行它。只是想弄清楚这一点,以便我可以完成它。

编辑:我使用的是 [A-Z]+、[A-Z]+,但它没有选择整行,也没有考虑空格和连字符。

回答:以下正则表达式满足了我的需求:

^(?!.*[a-z])(?!.*[0-9]).+$

第 2 部分答案:我还进行了调整,以完成我的请求的第二部分,即在匹配项之前添加三个换行符。

^((?!.*[a-z\d]).+)$

我还确保选择了匹配案例。它正在使用正则表达式。并替换为以下内容:

\n\n\n\1

谢谢大家!

【问题讨论】:

  • 显示你当前的正则表达式!
  • 添加在上面。谢谢。
  • 嗨詹姆斯,请将您的答案添加为答案,而不是编辑您的问题。

标签: regex


【解决方案1】:

对小写字符使用否定前瞻:

^(?!.*[a-z]).+$

这匹配“任何不包含小写字母的行”。


也不允许数字:

^(?!.*[a-z\d]).+$

【讨论】:

  • 这很好用,但我也有只包含数字的行,所以我需要否定数字。所以做了一个快速添加: ^(?!.*[a-z])(?!.*[0-9]).+$ 它就像我想要的那样工作!谢谢。
  • 酷。请参阅编辑后的答案以获得更简单的否定数字的方法。
  • 我没有考虑像 AL'JOHN 这样的名字中的撇号。我可以更新它以包括那些吗?
  • 不确定您所说的“帐户”是什么意思。他们已经被允许了。如果您也想排除撇号,请将' 添加到字符类:^(?!.*[a-z\d']).+$。但是,如果列表太长,则可能更简单地使用字符类来代替 允许,例如 ^[A-Z -,]+$。
  • 如果您在 Notepad++ 或 Atom 中使用此正则表达式,请务必启用“匹配大小写”,否则它将无法正常工作。我确信这两个程序都是错误的,直到我意识到这个 GUI 选项起作用。这让我感到惊讶,因为我认为当您使用正则表达式时会忽略此设置,并且它将纯粹使用正则表达式,但如果未设置,则两个程序都将大小写视为相同。
【解决方案2】:

对 POSIX 字符类使用扩展正则表达式

这将适用于您使用 GNU grep 提供的语料库。适应数据的任何变化。

$ grep \
      --extended-regexp \
      --only-matching   \
      --regexp='[[:upper:]-]+, ?[[:upper:]]+' \
      /tmp/corpus 
DOE, JOHN
DOE-SMITH, JOHN
DO, JO
DOE, JOHN
DOE,JOHN

使用 GNU Sed 添加换行符

您可以使用 GNU sed 中的附加操作来执行此操作。例如:

$ sed \
      --regexp-extended '/[[:upper:]-]+, ?[[:upper:]]+/a\\n\n\n' \
      /tmp/corpus
DOE, JOHN L




DOE-SMITH, JOHN L




DO, JO L




DOE, JOHN BOB L




DOE,JOHN L

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    相关资源
    最近更新 更多