2017-11-11 297 views
1

我正在使用Ruby 2.1。我有这样的逻辑,看起来连续字符串对在一个更大的字符串如何判断在正则表达式中匹配之间是否有三个或更多的字符?

results = line.scan(/\b((\S+?)\b.*?\b(\S+?))\b/) 

我的问题是,我该如何遍历结果列表中,并打印出是否有两个字符串之间的三个或更多字符?举例来说,如果我的字符串是

"abc  def" 

以上会产生

[["abc  def", "abc", "def"]] 

,我想知道是否有“ABC”和之间的三个或更多字符“高清”。

+1

你参考(这是符合你的正则表达式),但你的榜样“两个字符串之间的三个或更多字符”只包含两个字符串之间的空格(即一个特定字符)。这是令人困惑的。 –

+0

我正在使用与我的表达式匹配的示例。我在我的问题b/c中使用了“characters”而不是“spaces”,我的正则表达式可能会比空格匹配更多。请让我知道我能做些什么来使问题更清楚。感谢卡里。 – Dave

+0

@Dave除了空格还有什么可能? – wp78de

回答

3

使用量词的空间其间:\b((\S+?)\b\s{3,}\b(\S+?))\b

而且,实际上并不需要内boundries: \b((\S+?)\s{3,}(\S+?))\b

+0

你改变我的正则表达式。我不想排除它们之间少于3个字符的对,我只是想确定当我遍历结果集时哪些对是那些对。 – Dave

+0

戴夫,没有必要引用你的“结果集”来产生你想要的结果。 wp78de正在提取两个匹配之间有3个或更多空格的字符串(这些字符将位于结果集中),与您的示例一致。如果它们之间应该是“3或更多*字符*”,则用'。{3,}'替换'\ s {3,}'。 –

+0

@Dave如果你真的想要走这条路线,你可以使用这样一个更复杂的模式,如果它们之间有3个或更多的空格,那么它的价值在2美元:['\ b(?:(\ w +?) :?(\ S {3,...})| \ b * \ b)(\ W +))\ B'](https://regex101.com/r/v3oG9M/3) – wp78de

0

一个简单的方法来检查,这是通过运行一个独立的正则表达式:

results.select!{|x|p x[/\S+?\b(.*?)\b\S+?/,1].size} 

将打印每一堆的大小。

另一种方法是把拍摄组的大小和减去它们:

results = [] 
line.scan(/\b((\S+?)\b.*?\b(\S+?))\b/) do |s, group1, group2| 
    results << $~ if s.size - group1.size - group2.size >= 3 
end 
相关问题