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

时间:2013-09-21 15:58:08

标签: regex

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

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

  • 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]).+$

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

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

我还确保选择了Match Case。它使用正则表达式。并替换为以下内容:

\n\n\n\1

谢谢大家!

2 个答案:

答案 0 :(得分:4)

对小写字符使用负向前看:

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

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


还要禁止数字:

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

答案 1 :(得分: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