如何匹配未定义数量的参数或如何匹配正则表达式中的已知关键字

时间:2014-03-11 16:44:31

标签: ruby regex

关于正则表达式的一些问题,对你来说很简单,但不适合我 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

1 个答案:

答案 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中使用各种方法还有其他方法可以做到这一点,但这证明了这种技术。我使用模式来定位关键字命中,因为它很快并且可以在字符串中找到关键字。您可以使用indexfindany?进行查找,但随着关键字列表的增长,它们会降低代码速度。