我想要一个与白色空格分隔的句子中所有单词组(单个单词和子句子)匹配的正则表达式。
示例:
"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"]
答案 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)