【问题标题】:Regext to match only ONE occurance of a pattern正则表达式仅匹配模式的一次出现
【发布时间】:2015-09-27 06:47:22
【问题描述】:

如何编写一个表示给定模式只存在一次的正则表达式?

例如,如果我正在搜索模式“文件”,

      123file345 --> Match
      asdffile12 --> match
      file12file --> does not match

【问题讨论】:

  • 您想使用哪个工具?

标签: regex linux


【解决方案1】:
^(?:(?!file).)*file(?:(?!file).)*$

您可以将其与grep -P 一起使用。参见演示。

https://regex101.com/r/cK4iV0/30

【讨论】:

  • 您好,谢谢。抱歉,但我想使用 Linux shell 来获取它。我可以这样做吗?
  • @LPD 你需要和grep -P一起使用
【解决方案2】:

你可以使用否定的lookahead

^(?!(?:.*?file){2}).*?file.*$

Test at regex101

您可以在 grep 中应用上述正则表达式。

grep -P '^(?!(?:.*?file){2}).*?file' file

^ 开始(?!(?:.*?file){2}) 的否定前瞻断言向前看,如果没有
2x(.*?lazily 任意数量的任意字符,后跟子字符串 file)。
如果此条件成功,如果包含子字符串file,则匹配.*?file.*所有字符串。

对于仅匹配行,不需要最后一个贪心点(匹配file 之后的任何字符)。

【讨论】:

  • 我也想过 :P 效果会更好 :)
  • -P 单独有助于打印找到匹配项的整行。这就是为什么我删除了最后一个.*
  • 谢谢乔尼。你能解释一下吗?在这些表达方式中我是菜鸟。
  • @LPD 我加了一点解释:]
【解决方案3】:

你只需要使用grep的invert选项:

grep -v 'file.*file' file

【讨论】:

    猜你喜欢
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 2022-08-13
    • 1970-01-01
    相关资源
    最近更新 更多