2011-02-25 23 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刪除正則表達式的字符串符號的funcionality。 private +"\s"" ")被轉換爲private\ \+,並且與match一起,將嘗試找到字符串private +object_name,這是不是你想要的。刪除Regexp.escape,它應該工作。

+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)}") 
+0

+1使用'Regexp.escape'。 –