2016-09-10 47 views
-3

我是ruby的新手,尝试使用正则表达式。 基本上我想读一个文件,并检查它是否有正确的格式。如何使用正则表达式匹配此模式

Requirements to be in the correct format: 
1: The word should start with from 
2: There should be one space and only one space is allowed, unless there is a comma 
3: Not consecutive commas 
4: from and to are numbers 
5: from and to must contain a colon 

from: z to: 2 
from: 1 to: 3,4 
from: 2 to: 3 
from:3 to: 5 
from: 4 to: 5 
from: 4 to: 7 
to: 7 from: 6 
from: 7 to: 5 
0: 7 to: 5 
from: 24 to: 5 
from: 7 to: ,,,5 
from: 8 to: 5,,5 
from: 9 to: ,5 

如果我有正确的正则表达式,那么输出应该是:

from: 1 to: 3,4 
from: 2 to: 3 
from: 4 to: 5 
from: 4 to: 7 
from: 7 to: 5 
from: 24 to: 5 

所以在这种情况下,这些都是假的:

from: z to: 2  # because starts with z 
from:3 to: 5  # because there is no space after from: 
to: 7 from: 6  # because it starts with to but supposed to start with from 
0: 7 to: 5  # starts with 0 instead of from 
from: 7 to: ,,,5 # because there are two consecutive commas 
from: 8 to: 5,,5 # two consecutive commas 
from: 9 to: ,5 # start with comma 
+1

这个问题似乎[似曾相识](http://stackoverflow.com/questions/39422263/regular-expression-not-working-correclty/39423003#39423003)。 –

回答

1

OK,正则表达式你想要的是这样的:

from: \d+(?:,\d+)* to: \d+(?:,\d+)* 

这里假定在from:列中也允许有多个数字。如果没有,你要想这一个:

from: \d+ to: \d+(?:,\d+)* 

要验证整个文件是有效的(假设它包含所有都是这样的一个行),你可以使用这样的功能:

def validFile(filename) 
    File.open(filename).each do |line| 
     return false if (!/\d+(?:,\d+)* to: \d+(?:,\d+)*/.match(line)) 
    end 
    return true 
end 
0

你在找什么叫做负向预测。具体来说,\d+(?!,,)其中说:匹配1个或更多的连续数字后面跟着2个逗号。这里是整个事情:

str = "from: z to: 2 
from: 1 to: 3,4 
from: 2 to: 3 
from:3 to: 5 
from: 4 to: 5 
from: 4 to: 7 
to: 7 from: 6 
from: 7 to: 5 
0: 7 to: 5 
from: 24 to: 5 
from: 7 to: ,,,5 
from: 8 to: 5,,5 
from: 9 to: ,5 
" 

str.each_line do |line| 
    puts(line) if line =~ /\Afrom: \d+ to: \d+(?!,,)/ 
end 

输出:

from: 1 to: 3,4 
from: 2 to: 3 
from: 4 to: 5 
from: 4 to: 7 
from: 7 to: 5 
from: 24 to: 5