【问题标题】:Exclude Matches which start with '#'排除以“#”开头的匹配项
【发布时间】:2015-07-05 20:00:21
【问题描述】:

我正在为我的纯文本文件使用这个简单的正则表达式:

\([A-Za-z]*\)

我得到如下匹配:

...(test)......(Next)......(Warning)... 等等

是否可以排除以# 开头的匹配项?例如:

 #  Caught Stealing from Something (Warning)   (3300-3599)

我尝试了很多并想出了这个:

(?:^\s*?#.*)|(\([A-Za-z0-9\s\-]*\))

现在我只需要显示第一个捕获组的匹配项,但我不知道如何。有人可以给小费吗?

【问题讨论】:

  • Perl 正则表达式?你有 grep 吗?我将问题分成两部分:grep FILE -Pe "^[^#]" | grep -shoPe "\(\w+\)"
  • 不知道,我正在使用 Eclipse 处理简单的 txt 文件。我想我不能在 eclipse 中使用你的解决方案......

标签: regex


【解决方案1】:

这并不像看起来那么简单。

通常你会使用 lookarounds 来完成类似的事情,但你的情况非常不正统。您希望获得与行相关的要求(缺少#)的非行相关结果(因为任何行都可以有任意数量的结果)。

环视通常是特定于行的,并且只有一个结果。

我的解决方案:

\s*?#.*(?:\n|$)|(\([A-Za-z0-9\s\-]*\))

DEMO

恐怕您无法避免在捕获组中获得结果。在这种情况下,您的所有结果都是 1 美元。这个想法是你描述一条评论线的可能性,如果没有满足,你描述你感兴趣的项目的外观。由于注释行选项是第一个,因此不会测试其中的项目

我还更改了您的正则表达式,使其也包含空格、破折号和数字,以提供更多 (content123) 等情况。如果您不希望这样,请放弃更改并使用\s*?#.*(?:\n|$)|(\([A-Za-z]*\))

肯定还有其他方法可以做到这一点,但这是我最成功的方法。

【讨论】:

  • 这其实很不错。你能解释一下你需要|.做什么吗?在我看来,如果没有它,您将进行更少的匹配,但您仍然会拥有包含 $1 组的非空值的所有匹配。
  • 它匹配但不捕获(因为?:),但你是对的,你实际上不再需要我写它的方式了。我用它来描述字符跳转,但正则表达式会自行尝试,因为我没有指定行或字符串的开始或结束。
  • 不幸的是它不起作用,我不明白你在说什么,我只能构建简单的正则表达式。您的解决方案也匹配以 # 开头的行,但我想完全忽略这些行。我只需要在 () 中有一个单词的匹配项,例如 (text)
  • 是的,这是有意的。您需要使用所谓的捕获组,并且需要以不同的方式调用它们,通常使用 $1。您正在使用什么文本编辑器/工具?没有一个解决方案,只要匹配就能给你想要的答案。
  • 啊,好的,谢谢安德里斯。我正在使用日食。捕获组的表达式看起来如何,或者在 eclipse 中不可能?
猜你喜欢
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2019-08-27
  • 2016-05-02
  • 1970-01-01
相关资源
最近更新 更多