Ruby:检查字符串是否以非常特定的方式格式化

时间:2014-09-07 18:56:00

标签: ruby regex string match geometry

我正在尝试编写一段代码,告诉用户字符串是否以特定方式格式化。格式看起来像这样(它是一个圆圈):

     ######\n
  ###      ###\n
 #            #\n
#              #\n
#              #\n
#              #\n
 #            #\n
  ###      ###\n
     ######\n
\n

为了清楚起见,包括换行符; #字符可以是现有字符类中的任何字符。

我想要做的是检查字符串(来自文件)是否包含一个或多个这些“圆圈”。多个圆圈应该像这样分开:

#            #\n
 ###      ###\n
    ######\n
\n
    ######\n
 ###      ###\n
#            #\n

所以这就是我尝试过的:

isCircle = "(     #{get_i}{6}\n"
isCircle += "  #{get_i}{3}       #{get_i}{3}\n"
isCircle += " #{get_i}             #{get_i}\n"
isCircle +=("#{get_i}               #{get_i}\n"*3)
isCircle += " #{get_i}             #{get_i}\n"
isCircle += "  #{get_i}{3}       #{get_i}{3}\n"
isCircle = "     #{get_i}{6}\n\n?)*"

isCircle = Regexp.new(isCircle)

(get_i是一个返回前面提到的字符类,正确转义并且所有内容的方法)

然而,当针对不正确的输入字符串进行测试时,它仍然告诉我匹配。 我做错了什么,我怎样才能正确地进行比赛?

2 个答案:

答案 0 :(得分:1)

也许这个:

[ ]+#{6}[\n ]+#{3}[ ]+#{3}[\n ]+(?>#[ ]+#[\n\s]+)+#{3}[ ]+#{3}[\n\s]+#{6}\s*

Demo

答案 1 :(得分:0)

这是你想要做的吗?

假设您要搜索此模式:

pattern = 
%{     ######
  ###      ###
 #            #
#              #
#              #
#              #
 #            #
  ###      ###
     ######
}

在一个文本文件中,其内容已被读入该字符串:

str =
 %{###
  ##
     ######
  ###      ###
 #            #
#              #
#              #
#              #
 #            #
  ###      ###
     ######
     #######
######
     ######
  ###      ###
 #            #
#              #
#              #
#              #
 #            #
  ###      ###
     ######
  ###
} 

只需使用String#scan

puts str.scan(pattern).join("\n")
     ######
  ###      ###
 #            #
#              #
#              #
#              #
 #            #
  ###      ###
     ######

     ######
  ###      ###
 #            #
#              #
#              #
#              #
 #            #
  ###      ###
     ######

如果你想要模式开始的str的线偏移:

sarr  = str.lines
parr  = pattern.lines
prows = parr.size
(sarr.size-prows+1).times.select { |i| sarr[i,prows] == parr }
  #==> [2, 13]