我试图根据停用词的列表将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 /'。 –