Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 代码格式-缓解难以理解的大型正则表达式的方法?_Regex_Coding Style_Code Formatting - Fatal编程技术网

Regex 代码格式-缓解难以理解的大型正则表达式的方法?

Regex 代码格式-缓解难以理解的大型正则表达式的方法?,regex,coding-style,code-formatting,Regex,Coding Style,Code Formatting,我使用的是一个很长的正则表达式,如果你没有在前5分钟内编写它,这是很难理解的- "/([^\s]+)\s*[^\[]+\[([^\]]+)\]\s*"([^\s]+)\s*([^\s]+)\s*([^"]+)"\s*([^\s]+)\s*([^\s]+) \s*"([^"]+)"\s*"([^"]+)"/ 有没有一种常用的方法可以在代码中格式化长正则表达式,从而提高可读性 我想把每个捕获组放在自己的线路上,例如 /([^\s]+) \s*[^\[]+\[([

我使用的是一个很长的正则表达式,如果你没有在前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时设置的一个练习的一部分。

只要使用
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"
请参阅:

您可以使用以下内容:

class Regexp
    def +(re)
      Regexp.new self.source + re.source
    end
end
要启用“+”运算符连接正则表达式,请执行以下操作:

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

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

例如:

/([^\s]+)
\s*  [^\[]+   \[ ( [^\]]+) \]
\s*           "  ( [^\s]+)    \s*  ([^\s]+)  \s* ([^"]+) "
\s*              ( [^\s]+)    \s*  ([^\s]+)
\s*           "  ( [^"]+ ) "
\s*           "  ( [^"]+ ) "/
结构可以改变世界,有时甚至比评论更重要。在为可读性而写作时,我认为表达式的布局应该与表达式本身一样反映其目的。否则,无论你的评论如何,读起来都会很痛苦


对于您继承的表达式,这样做也会很有帮助,因为事情真的会突然发生在您身上。(例如,在我创建了上面的代码之前,我不知道您正在配对引号或括号)

严格来说并不是在寻找Ruby答案,但这样就可以了:)忽略空白的
x
标志应该适用于大多数所有的正则表达式引擎。e、 g.perl: