簡體   English   中英

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

[英]Ruby: check if a string is formatted in a very specific way

我正在嘗試編寫一段代碼,告訴用戶是否以特定方式格式化了字符串。 格式如下所示(是一個圓圈):

     ######\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是一種返回上述字符類,正確轉義的字符以及所有內容的方法)

但是,當針對不正確的輸入字符串進行測試時,它仍然告訴我存在匹配項。 我在做錯什么,如何正確進行比賽?

也許這樣:

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

演示

這是你想做的嗎?

假設您要搜索此模式:

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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM