2011-02-25 17 views
1

プライベートコンストラクタを持つディレクトリ内のjavaファイルを識別できる単純なスクリプト式を記述しようとしています。私はいくつか運があったが、私はスクリプトがアクセス修飾子とコンストラクタ名の間に空白があることを認識するようにしたいが、スペースかnスペースかタブかnタブかどうかは気にしない。Rubyの正規表現で空白を扱う問題

私は試している使用する...

"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

二重引用符で囲まれた文字列はそれで"\s"" "として、何の問題も読まないが、この場合には、単一引用符で囲まれたを使用することを好みます。 Regexp.escapeは、文字列の正規表現のシンボルの機能を削除します。 private +"\s"" ")はprivate\ \+に変換され、matchは、private +object_nameという文字列を検索しようとします。 Regexp.escapeを削除しても問題ありません。

+0

私は一重引用符と二重引用符の違いを認識しませんでした。ありがとう。 –

3

@LBgも指摘するように、私は

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

、例えば、あなたはRubyの文字列に\をエスケープしても、自分のオブジェクト名ではなく、空白マッチャーを含めた全体の正規表現をRegexp.escapeしたいと思います、 +連結を使用する場合は、\をエスケープする必要のない単一引用符を使用する方がよいでしょう。または、次のような置換でdoubleを使用してください:

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

+1 'Regexp.escape'を使用しています。 –