正则表达式匹配文件中的空行和注释

时间:2013-08-20 14:47:19

标签: ruby regex erb

阅读时如何忽略文件中的注释或空白/空行?我认为/^[\s#]*$/会完成这项工作,但事实并非如此:

irb(main):180:0> open(inFile, 'r').each { |ln| puts ln if ln !~ /^[\s#]*$/ }
....
....
# and ..... ThIs Is A cOmMeNt .....
....
....
=> #<File:/tmp/running-instances.txt>
irb(main):181:0> 

我在这里缺少什么?任何帮助将受到高度赞赏。干杯!!

PS。

我可以分两步单独完成:

open(inFile, 'r').each { |ln| next if ln =~ /^\s*$/; puts ln if ln !~ /#[^#]*$/ }

8 个答案:

答案 0 :(得分:9)

匹配评论和行尾

/
  ^      # match start of line
  \s*    # match zero or more spaces
  (\#|$) # match comment symbol or end-of-line
/x

压缩,正则表达式看起来像这样:

/^\s*(#|$)/

散文解释

\s*表示在行开始后的任何数量的空格,包括 none ,都可以匹配。 (\#|$)使用alternation,因此括号内的任何一种模式都可以匹配。 注意:只有在使用x option时才需要使用反斜杠来转义注释符号,这会忽略正则表达式中的空格和注释;如果您没有使用x,请退出反斜杠。

因此,模式将匹配行首和后跟可选空格,然后必须紧跟注释符号或行尾。因为匹配为anchored,所以匹配"foo # bar"" Array#string\n"等字符串,因为它们与所需的模式不匹配。

答案 1 :(得分:1)

我相信这就是你想要做的。

^( *#.*| *?)$

#之前的空格的原因是,注释可以缩进一个或几个空格。如果该行不是注释,我们会尽可能多地吸收空间,看看是否存在这一点。

为清晰起见,该空格可以写为[ ]

^([ ]*#.*|[ ]*?)$

或包含标签:

^([ \t]*#.*|[ \t]*?)$

rubular(蓝色的东西不匹配)

答案 2 :(得分:1)

这个正则表达式怎么样:

/^(#.*|\s*)$/

答案 3 :(得分:1)

我认为比其他答案更简单。

/^\s*(#.*)?$/

答案 4 :(得分:0)

我认为您应该/^[\s#].*$/,使用.来匹配任何字符。

答案 5 :(得分:0)

open(inFile, 'r').each { |ln|  puts ln if ln !~ /^(\s+|#.+)$/ }

此正则表达式查找任意数量的空格字符,直到行尾或哈希符号后跟任何字符,直到行尾。我相信[\ s#] *会查找零个或多个空格字符或哈希符号,其中添加了一个。将在哈希符号后面查找任何字符作为匹配。

答案 6 :(得分:0)

要回到你正在寻找的角色类方法......

没有必要匹配整条线。您只需要第一个非空间的部分。

因此,我们的想法是匹配以注释字符以外的其他内容结尾的空格的前导前缀。因为匹配器会回溯,所以您还必须禁止匹配中的最后一个字符为空格。

open('foo.txt', 'r').each { |ln| ln.chomp!; puts ln if ln =~ /\A\s*[^#\s]/ }

我假设你想在评论字符前允许前导空格。不要忘记选择换行符以准确重播文件。

答案 7 :(得分:0)

特别是 Java 为我工作

  

(^((\ S)#+ )$。)|(^(\ S)* $)

它考虑'#'之前的任意空格和只有空格的空行。所以

  

string.matches( “(^ \ S *#+ $)|。(^ \ S $)”)

对于所有注释行和空行,

返回true。