代码格式化 - 减轻难以置信的大型正则表达式的方法?

时间:2011-07-18 18:28:10

标签: regex coding-style code-formatting

我正在使用一个很长的正则表达式,如果你在之前的5分钟内没有写它就很难理解 -

"/([^\s]+)\s*[^\[]+\[([^\]]+)\]\s*"([^\s]+)\s*([^\s]+)\s*([^"]+)"\s*([^\s]+)\s*([^\s]+)         \s*"([^"]+)"\s*"([^"]+)"/

是否有一种常用的方法可以在代码中格式化长正则表达式,以提高可读性?

我想把每个捕获组放在自己的行上,例如

          /([^\s]+)
\s*[^\[]+\[([^\]]+)
     \]\s*"([^\s]+)
        \s*([^\s]+)
         \s*([^"]+)
       "\s*([^\s]+)
        \s*([^\s]+)
        \s*"([^"]+)
       "\s*"([^"]+)"/

如果我可以在正则表达式的每个部分逐行放置注释,这将是非常好的,但Ruby不会让我。

我对如何处理大正则表达式的一般问题比对解析文本的更好方法更感兴趣...这个特殊情况只是我在学习一点Ruby时自己设定的练习的一部分。

3 个答案:

答案 0 :(得分:2)

只需使用x标志(表示忽略空格)。

然后你也可以发表评论。见例:

          /([^\s]+) #Matches 1+ not whitespace.
\s*[^\[]+\[([^\]]+) #Matches 0+whitespace and an open bracket "["
     \]\s*"([^\s]+) #Matches a closing brack, space and and an open ", and some text
        \s*([^\s]+) #Matches
         \s*([^"]+)
       "\s*([^\s]+)
        \s*([^\s]+)
        \s*"([^"]+)
       "\s*"([^"]+)"/x =~ 'ss[s] "ss" " " dd dd "sdf" "  df"sdfasdf'        

print Regexp.last_match  #=> ss[s] "ss" " " dd dd "sdf" "  df"

请参阅:http://codepad.org/PDSxQUQf

答案 1 :(得分:1)

你可以用这个:

class Regexp
    def +(re)
      Regexp.new self.source + re.source
    end
end

启用'+'运算符以连接Regex表达式:

           /([^\s]+)/ + # Comment
/\s*[^\[]+\[([^\]]+)/ + # Comment
     /\]\s*"([^\s]+)/ + # Comment
        /\s*([^\s]+)/ + # Comment
         /\s*([^"]+)/ + # Comment
       /"\s*([^\s]+)/ + # Comment
        /\s*([^\s]+)/ + # Comment
        /\s*"([^"]+)/ + # Comment
      /"\s*"([^"]+)"/   # Comment

答案 2 :(得分:1)

正如其他人发布的那样,我通常将标志设置为忽略模式空白区域。 除了允许多行正则表达式和注释之外,它还允许您通过逻辑分组或函数来分离正则表达式。

示例:

/([^\s]+)
\s*  [^\[]+   \[ ( [^\]]+) \]
\s*           "  ( [^\s]+)    \s*  ([^\s]+)  \s* ([^"]+) "
\s*              ( [^\s]+)    \s*  ([^\s]+)
\s*           "  ( [^"]+ ) "
\s*           "  ( [^"]+ ) "/

结构可以在世界上发挥重要作用,有时甚至超过评论。在为可读性而写作时,表达式的布局应该与表达式本身一样反映其目的。否则,无论你的评论是什么,阅读都会很痛苦。

对于你继承的表达式也可以这样做,因为事情真的会向你跳出来。 (我不知道你是在配对引号或括号,直到我创建了上面的内容,例如)