在所有大写字母中查找名字的正则表达式

3
我正在尝试编写一个正则表达式,以便在txt文件中查找包含大写字母名称的行,使用Notepad++或类似工具。一旦我找到匹配的行,我想添加三个换行符。
由于这些行是名称,我有各种条件。其中一些名称仅有两个字符。有些带有连字符。有些有多个名称。有些在最后一个名字和逗号之后没有空格。以下是一些示例:
DOE,JOHN L DOE-SMITH,JOHN L DO,JO L DOE,JOHN BOB L DOE,JOHN L
我也可以在其他程序中运行它。只是试图搞清楚这个问题,所以我可以完成它。
编辑:我曾使用[A-Z]+,[A-Z]+,但它未选择整行,也未考虑空格和连字符。
答案:以下正则表达式满足我的需求:
^(?!.*[a-z])(?!.*[0-9]).+$

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

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

我确认了“匹配大小写”这个选项被选中。它使用了正则表达式,并替换成以下内容:
\n\n\n\1

Thanks Everyone!


1
展示你当前的正则表达式! - Toby Allen
嗨,詹姆斯,请将您的答案添加为答案,而不是编辑您的问题。 - Toby Allen
2个回答

5

使用否定先行断言匹配小写字符:

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

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


要同时禁止数字:

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

这个很好用,但我也有只包含数字的行,所以我需要否定数字。所以我做了一个快速添加:^(?!.[a-z])(?!.[0-9]).+$现在它正如我所想的那样工作!谢谢。 - James Bullis
很好。查看编辑后的答案,还有更简单的否定数字的方法。 - Bohemian
我没有考虑到像AL'JOHN这样的名字中的撇号。我能更新它以包括那些吗? - James Bullis
1
不确定您所说的“account for”是什么意思。它们已经被允许了。如果您也想排除撇号,请将 ' 添加到字符类中:^(?!.*[a-z\d']).+$。但如果列表变得太长,可能更简单的方法是使用一个字符类来表示允许的内容,例如 ^[A-Z -,]+$ - Bohemian
如果您在Notepad++或Atom中使用此正则表达式,请确保启用“匹配大小写”,否则它将无法正常工作。我曾经认为这两个程序都有漏洞,直到我意识到这个GUI选项的作用。这让我感到惊讶,因为我以为当您使用正则表达式时,此设置将被忽略,并且它将纯粹使用正则表达式,但如果未设置,则两个程序将对待大写和小写字母相同。 - James Toomey

0

使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接