我正在尝试编写一个简单的脚本表达式,它允许我识别具有私有构造函数的目录中的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
答案 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}},它应该可以正常工作。