Ruby正则表达式和子串

时间:2012-02-24 13:57:33

标签: ruby regex

我遇到这些字符串有问题:

1) 125******* or 125co****** or 125CO*******
2) 125af***** or 125AF****** or 125f****** or 125AF********

初始数字的长度可以在2到11个字符之间,然后是一些子字符串(例如“co”,“f”等),然后是字母数字字符串。

现在我制作了这两个正则表达式,但它们无法正常工作:

/^([0-9]{2,11})([c]?[o]?)/i
/^([0-9]{2,11})(a?)f/i

请注意,两种情况都不应该发生冲突。 1)和2)是分开的。 我该怎么办?

编辑:从评论中添加:

我添加了更多信息来解释。通过管理面板,用户可以上传文件,系统应根据其名称将它们保存到正确的目录中。

EG。一个名为

的文件
125.doc or 
125co_tes.doc or 
125CO_tes.doc

应保存到“集合”目录中,
但那些叫做

125af.double.jpg or 
125AF-happy.txt or 
125f_testlong.xls or 
125AF.pdf

应保存到“文档”目录中,依此类推。

3 个答案:

答案 0 :(得分:1)

匹配“集合”的文件:

/^(\d{2,11})((?:(?:c?o|co?).*)?\.[a-z0-9]+)$/i

匹配“文档”的文件:

/^(\d{2,11})((?:af?|a?f).+)$/i

如果您的申请不够严格(或太严格),请告诉我。

答案 1 :(得分:1)

string="125af.double.jpg"
case string
  when /^([0-9]{2,11})(a?)f/i
    # Document
  when /^([0-9]{2,11})([c]?[o]?)/i
    # Collection
end

如果先检查/^([0-9]{2,11})(a?)f/i,则表示2个正则表达式之间没有冲突。

答案 2 :(得分:0)

使用以下内容,您可以测试两种文件类型

if filename =~ /^\d{2,11}(co|a?f)?/i 
  if $1 == '' || $1.downcase == 'co'
     # do CO
  elsif $1.downcase == 'af'
     # do AF
  end
end

见行动http://rubular.com/r/7jGxQVJMNC

如果你有更多2例,那肯定很难维持......