【问题标题】:Regex match anything except ending string正则表达式匹配除结束字符串之外的任何内容
【发布时间】:2016-01-29 04:41:13
【问题描述】:

我正在尝试创建一个匹配任何内容的正则表达式,除了一个完全结束的字符串,在这种情况下,扩展名为 '.exe'。

文件示例:

  1. 'foo'(无扩展名)我想得到'foo'
  2. 'foo.bar' 我想得到'foo.bar'
  3. 'foo.exe.bar' 我想得到'foo.exe.bar'
  4. 'foo.exe1' 我想得到'foo.exe1'
  5. 'foo.bar.exe' 我要获取'foo.bar'
  6. 'foo.exe' 我想得到'foo'

到目前为止,我创建了正则表达式 /.*\.(?!exe$)[^.]*/ 但它不适用于案例 1 和 6。

【问题讨论】:

  • 上下文是什么?如果我正在扫描不以.exe 结尾的字符串,我可能只使用"does not match" operators !~ /\.exe$/

标签: ruby regex


【解决方案1】:

您可以使用积极的lookahead

^.+?(?=\.exe$|$)
  • ^ 字符串开头
  • .+?greedily 匹配一个或多个字符...
  • (?=\.exe$|$) 直到文字 .exe 出现在末尾。如果不是,则匹配结束。

See demo at Rubular.com

【讨论】:

  • 这正是我想要的。谢谢:)
  • 你是个巫师。谢谢。
【解决方案2】:

难道不是简单的替换工作吗?

string.sub(/\.exe\z/, "")

【讨论】:

    【解决方案3】:

    你的意思是正则表达式匹配还是捕获

    可能只有一个正则表达式的答案,但它目前躲避我。根据您的测试数据和您想要匹配的内容,执行以下操作将涵盖您想要匹配和捕获的内容:

    name = 'foo.bar.exe'
    match = /(.*).exe$/.match(name)
    if match == nil
      # then this filename matches your conditions 
      print name
    else
      # otherwise match[1] is the capture - filename without .exe extension
      print match[1]
    end
    

    【讨论】:

    • 请使用正确的 Ruby 缩进。它可以帮助其他人理解您的代码。
    【解决方案4】:
    string pattern = @" (?x)  (.* (?= \.exe$ )) | ((?=.*\.exe).*)";
    
    • 第一个匹配是一个正向的前瞻,它检查你的字符串是否 以.exe 结尾。条件不包括在匹配中。
    • 第二次匹配是正向前瞻,条件包含在 匹配。它只检查你是否有一些后面跟着.exe的东西。

    (?x) is 表示模式字符串中的空格被忽略。 或者不使用 (?x) 并删除所有空格。

    它适用于所提供的所有 6 种场景。

    【讨论】:

    • 我不敢相信有人反对这个答案,它有效。
    • 查看您建议的模式,它根本行不通。嵌入空间很重要,如果您查看rubular.com/r/wys2Kl2yVL,您会发现它是如何失败的。即使使用了x 标志,就像rubular.com/r/4AEtcOKdAX 一样,它仍然会失败。
    • 普通人我在它前面使用了 Rgex 选项 (?x),它使模式更具可读性。我的错........但是在你对我的答案投反对票之前,你应该知道在匹配模式字符串中允许空格的选项。
    • 我知道x。它不是新的,也不限于 Ruby。您的答案没有提到使用x,如果您要使用微不足道的嵌入式空间,则应该这样做,因为这些空间会混淆和误导任何阅读您的答案但不了解它们的人。你在我发表评论后添加了这一点。这就是我添加评论的原因,以便您可以改进它并避免进一步的反对票。即使有标志,您的模式也不能作为 OP 所需的工作,因为它没有正确处理前两个测试。此外,在引用用户名时要尊重并使用正确的名称。
    猜你喜欢
    • 2016-05-05
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多