正则表达式在rails应用程序中获取路径

时间:2014-07-02 14:52:46

标签: regex perl

我正在使用来自我的rails应用程序的git日志写一个perlscript到glob所有文件。 我需要帮助从git stat输出中捕获路径。

示例:

  app/controllers/bottled_lot_controller.rb          |   18 -\
  app/models/kastar.rb          |   18 -\
  app/helpers/bottled_helper.rb          |   18 -\

我的正则表达式并不适用于所有这些行 谁有更好的主意呢?

[a-z]*\/[a-z]*\/[a-z || _ ]*.rb

3 个答案:

答案 0 :(得分:1)

您的模式包含一些错误,但如果您使用/x修饰符以使嵌入空格无关紧要,它可能对您有用

喜欢这个

use strict;
use warnings;

while (<DATA>) {
  next unless /([a-z]*\/[a-z]*\/[a-z || _ ]*.rb)/x;
  print $1, "\n";
}

__DATA__
  app/controllers/bottled_lot_controller.rb          |   18 -\
  app/models/kastar.rb          |   18 -\
  app/helpers/bottled_helper.rb          |   18 -\

<强>输出

app/controllers/bottled_lot_controller.rb
app/models/kastar.rb
app/helpers/bottled_helper.rb

问题是字符类[a-z || _ ]匹配单个字符,可能是小写字母,空格,竖线|或下划线_。字符类中的重复字符没有额外的效果,并且由于数据中没有管道字符,您只需要避免匹配空格字符,这是/x修饰符具有的效果。

您想要的字符类只是[a-z_],并且您可以更改正则表达式分隔符以避免必须转义斜杠,完整的模式看起来像

m{([a-z]+/[a-z]+/[a-z_]+\.rb)}

如果您将上述程序中的next unless行更改为

next unless m{([a-z]+/[a-z]+/[a-z_]+\.rb)};

然后它继续正常工作,但这一次出于正确的原因!


<强>更新

由于您已表明您还希望接受以零个或多个路径段开头的路径,因此您应该使用此模式

next unless m{ ( (?: [a-z]+/ )* [a-z_]+\.rb ) }x;

答案 1 :(得分:1)

输入:

appTestParent/app/models/bottled_lot_controller.rb      rb rb    |   18 -\
app/controllers/bottled_lot_controller.rb          |   18 -\
app/models/kastar.rb          |   18 -\
app/helpers/bottled_helper.rb          |   18 -\
app/bottled_helper.rb          |   18 -\
bottled_helper.rb          |   18 -\

您可以尝试使用以下正则表达式:[a-z_]*?\/*?.*[.]rb,它将为您提供以下输出:

appTestParent/app/models/bottled_lot_controller.rb
app/controllers/bottled_lot_controller.rb
app/models/kastar.rb
app/helpers/bottled_helper.rb
app/bottled_helper.rb
bottled_helper.rb

答案 2 :(得分:1)

因为数据来自git日志,我认为我们可以假设更多格式良好的数据然后可以在一般文件系统搜索中找到。也就是说,将.rb扩展名视为硬边界条件可能就足够了。

因此,我可能只使用以下正则表达式:

(?:\w+/)*\w+\.rb