3

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

由于线条是名称,因此我有各种条件。有些名字只有两个字符。有些有连字符。有些有多个名称。有些人的姓氏和逗号后没有空格。这里有些例子:

  • 美国能源部,约翰 L
  • 美国能源部史密斯,约翰 L
  • 做,乔
  • 美国能源部,约翰·鲍勃
  • 美国能源部,约翰 L

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

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

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

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

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

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

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

\n\n\n\1

感谢大家!

4

2 回答 2

4

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

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

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


还要禁止数字:

^(?!.*[a-z\d]).+$
于 2013-09-21T16:00:43.847 回答
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
于 2013-09-21T16:05:31.780 回答