【问题标题】:Regex: remove lines not starting with a digit正则表达式:删除不以数字开头的行
【发布时间】:2009-12-01 13:51:02
【问题描述】:

我一直在 RegEx 备忘单的帮助下解决这个问题,试图弄清楚如何做到这一点,但我放弃了......我在 Notepad++ 中打开了这个冗长的文件,并想删除所有行不要以数字 (0..9) 开头。我会使用 N++ 的查找/替换功能。我只是提到这一点,因为我不确定 N++ 使用的是什么正则表达式实现......谢谢

示例。摘自以下文字:

1hello
foo
2world
bar
3!

我要提取

1hello
2world
3!

不是:

1hello

2world

3!

通过对正则表达式进行查找/替换。

【问题讨论】:

标签: regex notepad++


【解决方案1】:

您可以使用^[^0-9].* 清除这些行,但它会留下空白行。

Notepad++ 使用 scintilla,并且还使用其正则表达式引擎来匹配这些。

\r 和 \n 永远不会匹配,因为在 闪烁,正则表达式搜索 逐行制作(剥离 行尾字符)。

http://www.scintilla.org/SciTERegEx.html

要清除那些空行,唯一的办法就是选择扩展模式,把\n\n替换成\n,如果你是windows模式,把\r\n\r\n改为\r\n

【讨论】:

  • 哦,好吧,我想我会对这个解释感到满意。
  • 我后来学到的一个巧妙的技巧,用于消除 Windows 上的空白行:将 \n\r 替换为空行。这样\r\n\r\n 就变成了\r\n。任意数量的空白点赞将缩短为 \r\n。
  • 请注意 Peter Perháč 的书签回答。这正是我登陆此页面时所需要的。 (我将此评论添加到已接受的答案中,因为当第一次回答问题时,Notepad++ 中可能没有该功能。)
【解决方案2】:

[^0-9] 是一个正则表达式,几乎可以匹配除数字以外的任何内容。如果您说^[^0-9],则在大多数正则表达式系统中,您将其“锚定”到行首。如果您想包含该行的其余部分,请使用^[^0-9].+

【讨论】:

  • 也有效,但留下了很多空白行。如何也捕获换行符?
  • 您是否尝试在表达式末尾添加[\r\n]*
  • 看起来这仅适用于 np++ 的“扩展模式”,但不适用于正则表达式。
【解决方案3】:

^[^\d].* 标记首字符不是数字的整行。检查数字前面是否真的没有空格。否则你必须使用不同的表达方式。

更新: 您必须分两步完成。首先清空不以数字开头的行。然后在扩展模式下删除空行。

【讨论】:

  • 这可以找到所有不以数字开头的行,但是当我进行搜索/替换时,搜索 ^[^\d].* 将其替换为空,我仍然离开有很多空白行。我如何让您的正则表达式也捕获换行符?
  • 您可以先尝试删除所有带数字的行。然后你可以切换到“扩展模式”。我对其进行了测试,它适用于我在这里使用\r\n 找到换行符。然后用 nothgin 替换它们。
  • 是的,这是一种久经考验的方法,但我希望这一切都可以一步完成。也许如果我使用其他编辑器,但它是 npp,所以我会满足于分两步执行此操作 :) 干杯
【解决方案4】:

还可以使用 Notepad++ 中的书签技术。不久前,我开始受益于此功能(存在很长时间,但最近才在 UI 中更加明显)。

只需打开查找对话框,为不以数字^\D.*$ 开头的行键入正则表达式,然后选择全部标记。这将在左侧排水沟中放置蓝色圆圈,如弹珠 - 这些是行书签。然后只需从主菜单中选择搜索 -> 书签 -> 删除带书签的行。

书签很酷,您可以通过简单地选择复制书签行、打开新文档并在那里粘贴行来提取这些行。在查看日志文件时,我有时会使用这种技术。

【讨论】:

  • 很棒的提示!为了删除不匹配的行,还有“删除未标记的行”。通常我可以很容易地对我想要保留的内容进行正则表达式;现在很容易删除其余部分。谢谢!
【解决方案5】:

我不确定你在问什么。但是用于查找开头带有数字的行的 reg exp 将是 ^\d.* 您可以删除与上述匹配的所有行,或者保留与此表达式匹配的所有行: ^[^\d].*

【讨论】:

  • 我想弄清楚我的问题的哪一部分不清楚。我会编辑它,但我想我很清楚地问如何remove lines not starting with a digit
  • 我不清楚你是如何删除的。现在我了解您正在使用搜索和替换。尝试搜索 ^[^\d].* 并替换为 \b (这是退格符或alternativley *这在过去对我有用)搜索 ^[^\d].*\R 并替换为什么都没有(R 必须是大写!)

    如果后者像“贪婪”一样,它会删除第一次匹配后的所有行,那么您可以尝试替换 ^[^\d][^\R] *\R 一无所有
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多