匹配单词组

时间:2017-06-30 08:01:09

标签: ruby regex

我想要一个与白色空格分隔的句子中所有单词组(单个单词和子句子)匹配的正则表达式。

示例:

"foo bar bar2".scan(regexp)

我想要一个将返回的regexp

['foo', 'bar', 'bar2', 'foo bar', 'bar bar2', 'foo bar bar2']

到目前为止,我试过了:

"foo bar bar2".scan(/\S*[\S]/)(即regexp=/\S*/) 返回['foo', 'bar', 'bar2']

"foo bar bar2".scan(/\S* [\S]+/)(即regexp=/\S* [\S]+/) 返回["foo bar", " bar2"]

2 个答案:

答案 0 :(得分:3)

words = "foo bar bar2".scan(/\S+/)
result = 1.upto(words.length).map do |n|
  words.each_cons(n).to_a
end.flatten(1)
#⇒ [["foo"], ["bar"], ["bar2"],
#   ["foo", "bar"], ["bar", "bar2"],
#   ["foo", "bar", "bar2"]]

result.map { |e| e.join(' ') }
#⇒ ["foo", "bar", "bar2", "foo bar", "bar bar2", "foo bar bar2"]

我们使用Enumerable#each_cons来获得结果。

答案 1 :(得分:0)

Mudasobwa对这个答案进行了很好的修改check here。 我已经使用了 combine ,内置的数组方法。程序几乎相同:

    string = "foo bar bar2"
    groups = string.split
    objects = []

      for i in 1..groups.size
       groups = string.split.combination(i).to_a
       objects << groups
      end

     results = objects.flatten(1).map { |e| e.join('-') }
     puts results

无论如何,你不能用一个正则表达式来做。(假设你有50个单词,需要找到所有的组合;正则表达式不能这样做)。你需要像Mudasobwa所展示的那样迭代对象。

我会开始这样做:正则表达式,如果你想使用一个,可以是/([^ \ s] \ w +)/ m;例如。 这个正则表达式将匹配单词。用文字来说,我的意思是用白色空格包围的字符组。

使用此功能,您可以扫描文本或拆分字符串。你可以做很多种方式,最后你会得到一个包含你想要组合的单词的数组。

    string = "foo bar bar2"

然后你拆分它,创建一个数组并将组合方法应用于它。

  groups = string.split
    => ["foo", "bar", "bar2"]

组合方法以数字作为参数,该数字将是&#39; size&#39;组合。组合(2)将元素组合成两组。 1 - 组的1 ... 0组零! (这就是我们开始与1组合的原因)。

您需要循环并覆盖所有可能的组大小,从而保存结果 在结果数组中。 :

    objects = []

使用元素数量作为循环的参数

       for i in 1..groups.size
         groups = string.split.combination(i).to_a
         objects << groups
        end

现在你只需完成一个循环来展平数组内的数组并取出逗号和双引号

results = objects.flatten(1).map {| e | e.join(&#39; - &#39;)}

多数民众赞成!您可以在此处https://repl.it/JLK9/1

运行上面的代码(示例包含更多字词)

Ps:问题和提到的答案都缺少组合(foo-bar2)