2

阅读时如何忽略文件中的注释或空白/空行?我以为/^[\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 !~ /#[^#]*$/ }
4

8 回答 8

11

匹配注释和行尾

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

压缩后,正则表达式如下所示:

/^\s*(#|$)/

散文解释

\s*意味着紧跟在行首之后的任意数量的空格,包括none of all,都可以匹配。(\#|$)使用交替,因此括号内的任何一个模式都可以匹配。注意:反斜杠只需要在使用x 选项时转义注释符号,它会忽略正则表达式中的空格和注释;如果您不使用,x则不要使用反斜杠。

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

于 2013-08-20T15:17:20.713 回答
2

这个正则表达式怎么样:

/^(#.*|\s*)$/
于 2013-08-20T14:58:21.713 回答
1

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

/^\s*(#.*)?$/
于 2013-08-20T15:14:29.287 回答
1

我相信这是你想做的。

^( *#.*| *?)$

前面有空格的原因#是,注释可以缩进一个空格或多个空格。如果该行不是注释,我们会尽可能多地占用空间,看看是否只有这些。

为了清楚起见,空格可以写成[ ]

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

或者包括标签:

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

rubular(蓝色的东西不匹配)

于 2013-08-20T14:56:11.167 回答
0

Especially in Java worked for me

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

It considers arbitrary whitespaces prior an '#' and empty lines with just whitespaces. So

string.matches("(^\s*#+.$)|(^\s$)")

returns true for all comment lines and empty lines.

于 2013-11-28T17:21:33.193 回答
0

要回到您正在寻求的角色类方法......

无需匹配整行。您只需要直到第一个非空格的部分。

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

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

我假设您希望在注释字符之前允许前导空格。不要忘记 chomp 换行以获得文件的准确重播。

于 2013-08-20T15:15:07.990 回答
0

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

于 2013-08-20T14:52:59.110 回答
0
open(inFile, 'r').each { |ln|  puts ln if ln !~ /^(\s+|#.+)$/ }

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

于 2013-08-20T15:11:59.627 回答