使用Ruby正则表达式处理空白区域的问题

时间:2011-02-25 19:34:39

标签: ruby regex

我正在尝试编写一个简单的脚本表达式,它允许我识别具有私有构造函数的目录中的java文件。我有一些运气,但我希望我的脚本能够确认访问修饰符和构造函数名称之间有空格,但不管它是空格还是n空格或制表符或n标签等。

我正在尝试使用......

"private\s+"+object_name

但+(1或更多)未找到修饰符和构造函数名称之间有2个空格的构造函数。

我知道我错过了什么。任何帮助将不胜感激。

感谢。

如果它有帮助,这是完整的代码......

!#/usr/bin/ruby

path = ARGV[0]
if path.nil?
    puts "missing path argument"
    exit
end

entries = Dir.entries( path )

entries.each do |file_name|
    file_name = file_name.rstrip
    if ( file_name.end_with? "java" )
        text = File.read( path+file_name )
        object_name = file_name.chomp( ".java" )
        search_str = "private\s+"+object_name
            matches = text.match( Regexp.escape( search_str ) )
            if ( !matches.nil? && matches.length > 0 )
                puts matches
            end
        end
end

2 个答案:

答案 0 :(得分:3)

我认为你想要在你的Ruby字符串和Regexp.escape中转义你的对象名,而不是整个正则表达式,包括空格匹配器,例如,

[...]
search_regex = Regexp.new("private\\s+" + Regexp.escape(object_name))
matches = text.match(search_regex)

正如@LBg也指出的那样,如果你想使用+连接,最好使用不需要转义\的单引号。或者使用带有替换的双打,如:

search_regex = Regexp.new("private\\s+#{Regexp.escape(object_name)}")

答案 1 :(得分:2)

双引号字符串将"\s"读为" ",没有问题,但在这种情况下更喜欢使用单引号。 Regexp.escape删除了正则表达式的字符串符号的功能。 private +"\s"" ")已转换为private\ \+,并且match会尝试找到字符串private +object_name,而不是Regexp.escape你想要什么。删除{{1}},它应该可以正常工作。