匹配的单词组

  • 本文关键字:单词组 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"]

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来获得结果。

Mudasobwa在这里做了一个很好的答案检查。 我已经对数组使用了组合,内置方法。过程几乎相同:

    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"]

组合方法将一个数字作为参数,该数字将是组合的"大小"。 组合(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('-'( }

就是这样!您可以运行上面的代码(带有更多单词的示例(这里 https://repl.it/JLK9/1

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

最新更新