如何使用正则表达式匹配此模式

时间:2016-09-10 20:39:20

标签: ruby regex

我是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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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