Ruby-regex返回文件中的字体URL

Ruby-regex返回文件中的字体URL,ruby,regex,Ruby,Regex,我试图解析一个javascript文件以返回字体URL 文件看起来像这样 @font-face { font-family: 'AlfaSlab'; iesrc: url('/lib/assets/themes/ek/skins/default/alfaslabone-regular-webfont.eot'); url('/lib/assets/themes/ek/skins/default/alfaslabone-regular-webfont.woff') 我想获取所有具有文

我试图解析一个javascript文件以返回字体URL

文件看起来像这样

@font-face {
  font-family: 'AlfaSlab';
  iesrc: url('/lib/assets/themes/ek/skins/default/alfaslabone-regular-webfont.eot');
  url('/lib/assets/themes/ek/skins/default/alfaslabone-regular-webfont.woff')
我想获取所有具有文件扩展名(eot、woff、svg、otf)的字体链接

我提出了这个正则表达式
/(\/lib\/.\/.*?\/.\。(eot | woff | ttf | svg))/
,但它也返回了文件扩展名(因为文件扩展名中的()

在ruby中,我正在做这个
files.map{file | file.read(file.scan(regex)}=>['/lib/assets/themes/ek/skins/default/alfaslabone regular webfont.eot','eot','/lib/assets/themes/ek/skins/default/alfaslabone regular webfont.woff','woff'.

如何修复正则表达式,使其仅返回文件路径,而不是返回2个数组元素中的文件路径+文件扩展名,谢谢:)

编辑:
我想返回文件扩展名为“/lib/assets/themes/ek/skins/default/alfaslabone regular-webfont.eot”的整个路径,“/lib/assets/themes/ek/skins/default/alfaslabone regular-webfont.woff”]应该是匹配项。。感谢您抽出时间

您可以重写您的正则表达式:

/([\w\-\/]+\.(?:eot|woff|ttf|svg))/
  • [\w\-\/]
    定义了一组字符:
    • \w
      单词字符,即字母(
      a-z
      a-z
      ),数字(
      0-9
      )和下划线(
    • \-
      连字符(
      -
    • 斜杠(
      /
  • +
    表示这些字符中的一个或多个
  • \。
    是文件扩展名前的点
  • (eot | woff | ttf | svg)
    是文件扩展名
  • ?:
    告诉正则表达式引擎不要为此捕获组生成反向引用

您可以重写您的正则表达式:

/([\w\-\/]+\.(?:eot|woff|ttf|svg))/
  • [\w\-\/]
    定义了一组字符:
    • \w
      单词字符,即字母(
      a-z
      a-z
      ),数字(
      0-9
      )和下划线(
    • \-
      连字符(
      -
    • 斜杠(
      /
  • +
    表示这些字符中的一个或多个
  • \。
    是文件扩展名前的点
  • (eot | woff | ttf | svg)
    是文件扩展名
  • ?:
    告诉正则表达式引擎不要为此捕获组生成反向引用

在看到您的评论后,我认为这个长正则表达式可以完成这项工作。因为,正如您所说,将所有可能的扩展包含在“()”中将始终创建第二个数组元素

/(\/lib\/.*?\/.*?\.eot|\/lib\/.*?\/.*?\.woff)|\/lib\/.*?\/.*?\.ttf|\/lib\/.*?\/.*?\.svg)/
我不是Ruby专家,但您可以通过 定义变量

$v = "\/lib\/.*?\/.*?\."
$m = "("+$v+"eot|"+$v+"woff|"+$v+"ttf|"+$v+"svg)"
Regexp.new $m

在看到你的评论后,我认为这个长正则表达式会起作用。因为,正如您所说,将所有可能的扩展包含在“()”中将始终创建第二个数组元素

/(\/lib\/.*?\/.*?\.eot|\/lib\/.*?\/.*?\.woff)|\/lib\/.*?\/.*?\.ttf|\/lib\/.*?\/.*?\.svg)/
我不是Ruby专家,但您可以通过 定义变量

$v = "\/lib\/.*?\/.*?\."
$m = "("+$v+"eot|"+$v+"woff|"+$v+"ttf|"+$v+"svg)"
Regexp.new $m

您是否尝试移动最后一个“)”如下:/(\/lib\/.*?\/.*?)\。(eot|woff | ttf | svg)/我想用文件扩展名匹配整个路径,这是该正则表达式的结果,感谢您的时间:)您是否尝试移动最后一个“)”/(\/lib\/.*?\/.*?。。。(eot | woff | ttf | svg)/我想用文件扩展名匹配整个路径,这是正则表达式的结果,谢谢你的时间:)它与url匹配而没有文件扩展名,我想包括文件扩展名,我在问题中添加了更多信息,谢谢它的工作原理,你能解释一下这个正则表达式是如何工作的吗,说到正则表达式,我真是个傻瓜。:)感谢与url匹配但没有文件扩展名的,我想包括文件扩展名,我在问题中添加了更多信息,感谢这项工作,你能解释一下这个正则表达式是如何工作的吗,说到正则表达式,我真是个傻瓜。:)谢谢