【问题标题】:regex - Find all strings not matching a pattern正则表达式 - 查找所有不匹配模式的字符串
【发布时间】:2016-08-12 15:25:08
【问题描述】:

我们每天都会收到一个包含数千行数据的文件。偶尔,几行会被搞砸,导致自动化过程失败。发生这种情况时,可能很难找到错误。

我想使用正则表达式来查找不符合文件通常结构的任何内容。所有行都应该如下所示:

ABC|SomeText|MoreText
DEF|SomeText|MoreText
ABC|SomeText|MoreText
GHI|SomeText|MoreText
DEF|SomeText|MoreText

所以一个正则表达式标记不以 3 个字母和一个竖线开头的行。 在下面的示例中,它将标记第 3 行。

ABC|SomeText|MoreText
DEF|Some
Text|MoreText
ABC|SomeText|MoreText
GHI|SomeText|MoreText
DEF|SomeText|MoreText

任何帮助将不胜感激,我已经为此苦苦挣扎了一段时间。

非常感谢

【问题讨论】:

  • 工具/编程语言是什么?
  • Notepad++ 如果您使用它,应该添加为问题标签。 Notepad++ 使用 Boost 正则表达式库,它不是 PCRE,但接近它。

标签: regex regex-negation


【解决方案1】:

解释您使用的正则表达式的方言会非常有帮助。例如,如果您使用 grep,您可以使用 -v 选项来反转含义,然后编写一个普通的正则表达式,如下所示:

grep -v -E '^[A-Z]{3}\|[^|]*\|'

否则,如果您无法反转意义,但您有一个能够使用 negative lookahead 的系统(如 Perl),您可以执行以下操作:

grep -P '^(?![A-Z]{3}\|[^|]*\|)'

(?!...) 部分使负前瞻。因此,这将匹配开头后面没有三个大写字母、一个条形、一些文本和另一个条形的任何行。

【讨论】:

  • 感谢尼尔的快速回复。我不确定方言。目前我正在使用 notepad++ 的正则表达式功能来搜索文件。不确定这是否有帮助。我会试试这些!
  • 显然 notepad++ 使用 PCRE(Perl 兼容的正则表达式),因此它应该支持带有负前瞻的第二个。祝你好运!
  • 你说的很对,这是赢的第二名。奇迹般有效!抱歉,这是我的第一个问题......我在哪里将其切换为正确答案?
  • 显然在分数下面应该有一个勾号,你可以点击答案。实际上,我以前从未问过问题,所以这对我来说也是新的☺meta.stackexchange.com/questions/5234/…
【解决方案2】:

例如,使用 awk:

awk '!/^[a-zA-Z]{3}\|/' input.txt

将显示“标记”行。

awk '/^[a-zA-Z]{3}\|/' in.txt

将显示正确的行。

【讨论】:

  • 谢谢 Wroniasty,我试试看!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
相关资源
最近更新 更多