关于正则表达式的一些问题,对你来说很简单,但不适合我 a)我想使用正则表达式匹配字符串。
keyword term1,term2,term3,.....termN
术语数量未定义。我知道怎么开始但是在我迷路之后; - )
\(\w+)(\s+) but after ?\i
b)稍微复杂一点:
capitale france paris,england london,germany berlin, ...
我想将夫妻分开来分析他们。
c)如何检查几个关键字中是否存在一个?
direction LEFT,RIGHT,UP,DOWN
答案 0 :(得分:0)
对于正则表达式,这不是一个好任务,因为您想要使用它。另外,你要问的几个问题必须通过几个步骤来解决;确定重复项不是正则表达式技能集的一部分。
正则表达式假设存在重复模式,如果您尝试一次解析整行不确定数量的元素,则需要一个非常复杂的模式。
我建议您使用简单的split(',')
来破解逗号:
'keyword term1,term2,term3,.....termN'.split(',')
# => ["keyword term1", "term2", "term3", ".....termN"]
'capitale france paris,england london,germany berlin, ...'.split(',')
# => ["capitale france paris", "england london", "germany berlin", " ..."]
一旦你进行了分割,如果你想在白色空间上分开复杂的条目,那就使用一个裸split
:
'capitale france paris,england london,germany berlin, ...'.split(',').map(&:split)
# => [["capitale", "france", "paris"],
# ["england", "london"],
# ["germany", "berlin"],
# ["..."]]
如果字段中有嵌入的逗号,则会全部崩溃。您正在使用的数据看起来像CSV(逗号分隔值),并且该规范允许它们。 IF 您使用的是真正的CSV数据,然后使用Ruby附带的CSV库。它将拯救你的理智,让你不再试图重新发明轮子。
要计算关键字,您可以执行以下操作:
entries = 'capitale france paris,england london,germany berlin, ...'.split(',').map(&:split)
# => [["capitale", "france", "paris"],
# ["england", "london"],
# ["germany", "berlin"],
# ["..."]]
keywords = Hash.new { |h, k| h[k] = 0 }
entries.each do |entry|
entry.each do |e|
keywords[e] += 1 if e[/\b(?:france|england|germany)\b/i]
end
end
keywords # => {"france"=>1, "england"=>1, "germany"=>1}
在Enumerable和Array中使用各种方法还有其他方法可以做到这一点,但这证明了这种技术。我使用模式来定位关键字命中,因为它很快并且可以在字符串中找到关键字。您可以使用index
或find
或any?
进行查找,但随着关键字列表的增长,它们会降低代码速度。