正则表达式匹配除结束字符串之外的任

时间:2016-01-27 21:55:52

标签: ruby regex

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

名为的文件示例:

  1. '富' (没有扩展名)我想得到' 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'
  7. 到目前为止,我创建了正则表达式/.*\.(?!exe$)[^.]*/ 但它对案例1和案件6不起作用。

4 个答案:

答案 0 :(得分:2)

不是简单的替代工作吗?

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

答案 1 :(得分:2)

您可以使用正lookahead

^.+?(?=\.exe$|$)
  • ^字符串开头
  • .+?greedily匹配一个或多个字符...
  • (?=\.exe$|$)直到文字.exe结束。如果没有,请匹配结束。

See demo at Rubular.com

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:-1)

string pattern = @" (?x)  (.* (?= \.exe$ )) | ((?=.*\.exe).*)";
  • 第一场比赛是一个积极的前瞻,检查你的字符串 以.exe结尾。该条件不包含在比赛中。
  • 第二场比赛是一个积极的前瞻,其中包含了条件 比赛。它仅检查您是否有.exe后面的内容。

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

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