Ruby 正则表达式匹配除结束字符串以外的任何内容

Ruby 正则表达式匹配除结束字符串以外的任何内容,ruby,regex,Ruby,Regex,我正在尝试创建一个正则表达式,该正则表达式与任何内容都匹配,除了一个精确的结束字符串,在本例中是扩展名“.exe” 名为的文件的示例: 'foo'(没有扩展名)我想要'foo' “foo.bar”我想要“foo.bar” 'foo.exe.bar'我想得到'foo.exe.bar' 'foo.exe1'我想要'foo.exe1' 'foo.bar.exe'我想得到'foo.bar' 'foo.exe'我想得到'foo' 到目前为止,我创建了regex/.\.(?!exe$)[^.]*/ 但是它不

我正在尝试创建一个正则表达式,该正则表达式与任何内容都匹配,除了一个精确的结束字符串,在本例中是扩展名“.exe”

名为的文件的示例:

  • 'foo'(没有扩展名)我想要'foo'
  • “foo.bar”我想要“foo.bar”
  • 'foo.exe.bar'我想得到'foo.exe.bar'
  • 'foo.exe1'我想要'foo.exe1'
  • 'foo.bar.exe'我想得到'foo.bar'
  • 'foo.exe'我想得到'foo'
  • 到目前为止,我创建了regex
    /.\.(?!exe$)[^.]*/

    但是它不适用于案例1和案例6。

    简单的替换难道不起作用吗

    string.sub(/\.exe\z/, "")
    
    你是说正则表达式匹配还是捕获

    也许有一个只有正则表达式的答案,但我现在想不起来。根据您的测试数据和您想要匹配的内容,执行以下操作将涵盖您想要匹配和捕获的内容:

    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
    
    • 第一个匹配是一个积极的前瞻,检查您的字符串 以
      .exe
      结尾。该条件不包括在比赛中
    • 第二场比赛是一个积极的展望,条件包括在比赛中 匹配。它只检查您是否有后跟
      .exe
      的内容
    (?x)表示忽略模式字符串中的空格。 或者不使用(?x),只删除所有空白

    它适用于提供的所有6种情况。

    您可以使用积极的方法

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

    上下文是什么?如果我扫描的字符串不是以
    .exe
    结尾,我可能只会使用:
    s!~/\。exe$/
    。请使用正确的红宝石缩进。这有助于其他人理解您的代码。这正是我想要的。谢谢:)你是个巫师。谢谢。我不敢相信有人会投反对票。这个答案很有效。看看你建议的模式,它根本不起作用。嵌入式空间非常重要,如果您仔细观察,就会发现它是如何失败的。即使使用了
    x
    标志,它仍然会失败。我在它前面使用了Rgex选项(?x),使模式更具可读性。我的错。。。。。。。。但在投票否决我的答案之前,你应该知道允许在匹配模式字符串中使用空格的选项。我确实知道
    x
    。它不是新的,也不局限于Ruby。你的答案没有提到使用
    x
    ,如果你打算使用无关紧要的嵌入空格,那么应该使用
    x,因为这些空格会混淆和误导阅读你答案的人,而这些人并不知道这些空格。你是在我的评论之后加的。这就是我添加评论的原因,这样你就可以改进它,避免进一步降低投票率。即使使用该标志,您的模式也不能按照OP要求工作,因为它不能正确处理前两个测试。此外,在引用用户名时,请尊重并使用正确的名称。
    
    string pattern = @" (?x)  (.* (?= \.exe$ )) | ((?=.*\.exe).*)";
    
    ^.+?(?=\.exe$|$)