我試圖根據停用詞的列表將Ruby中的字符串拆分爲更小的子字符串或短語。當我直接定義正則表達式模式時,split方法起作用;然而,當我試圖通過在split方法本身內進行評估來定義模式時,它不起作用。使用正則表達式在Ruby中分割字符串中的字符串
實際上,我想讀取停用詞的外部文件並用它來分割我的句子。所以,我希望能夠從外部文件構建模式,而不是直接指定它。我還注意到,當我使用'pp'與'puts'時,我得到了非常不同的行爲,我不知道爲什麼。我在Windows上使用Ruby 2.0和Notepad ++。
require 'pp'
str = "The force be with you."
pp str.split(/(?:\bthe\b|\bwith\b)/i)
=> ["", " force be ", " you."]
pp str.split(/(?:\bthe\b|\bwith\b)/i).collect(&:strip).reject(&:empty?)
=> ["force be", "you."]
上面的最後一個數組是我期望的結果。然而,這並不以下工作:
require 'pp'
stop_array = ["the", "with"]
str = "The force be with you."
pattern = "(?:" + stop_array.map{|i| "\b#{i}\b" }.join("|") + ")"
puts pattern
=> (?thwit)
puts str.split(/#{pattern}/i)
=> The force be with you.
pp pattern
=> "(?:\bthe\b|\bwith\b)"
pp str.split(/#{pattern}/i)
=> ["The force be with you."]
更新:使用下面的評論,我修改了原來的腳本。我也創建了一個方法來分割字符串。
require 'pp'
class String
def splitstop(stopwords=[])
stopwords_regex = /\b(?:#{ Regexp.union(*stopwords).source })\b/i
return split(stopwords_regex).collect(&:strip).reject(&:empty?)
end
end
stop_array = ["the", "with", "over"]
pp "The force be with you.".splitstop stop_array
=> ["force be", "you."]
pp "The quick brown fox jumps over the lazy dog.".splitstop stop_array
=> ["quick brown fox jumps", "lazy dog."]
'/(?:\的意見書\ C | \ bwith \ B)/'比較好寫的'/ \ B(:該|用?)\ B /'。 –