Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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
Ruby 正则表达式以匹配文件中的空行和注释_Ruby_Regex_Erb - Fatal编程技术网

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

Ruby 正则表达式以匹配文件中的空行和注释,ruby,regex,erb,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>

阅读时如何忽略文件中的注释或空行?我原以为
/^[\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> 

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

我相信这就是你想要做的

^( *#.*| *?)$
#
前面加空格的原因是,注释可以缩进一个空格或几个空格。如果这行不是评论,我们会尽可能多地占用空间,看看是否就这些

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

^([ ]*#.*|[ ]*?)$
或包含选项卡:

^([ \t]*#.*|[ \t]*?)$
(蓝色的东西不匹配)

这个正则表达式怎么样:

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

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

我认为比其他答案更简单

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

要回到你所寻求的角色类方法

没有必要匹配整条线路。您只需要零件到第一个非空间

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

open('foo.txt', 'r').each { |ln| ln.chomp!; puts ln if ln =~ /\A\s*[^#\s]/ }
我假设您希望在注释字符之前允许前导空格。别忘了咬住新行以获得文件的准确重播

匹配注释和行尾 压缩后的正则表达式如下所示:

/^\s*(#|$)/
散文解释
\s*
表示在行首之后的任意数量的空格,包括完全没有,都可以匹配
(\\\#|$)
使用,因此括号中的任一模式都可以匹配。注意:当使用
x
时,反斜杠仅用于转义注释符号,它忽略正则表达式中的空格和注释;如果没有使用
x
,请将反斜杠去掉


因此,该模式将匹配行的开头,后跟可选的空白,然后必须紧接着后跟注释符号或行的结尾。因为匹配是,所以它不会匹配字符串,比如
“foo#bar”
“Array#string\n”
,因为它们不会匹配所需的模式。

特别是在Java中,这对我来说非常有用

(^(\s)*$)|(^(\s)*$)

它考虑“#”之前的任意空格和仅包含空格的空行。所以

string.matches((^\s*.$)|(^\s$))


对于所有注释行和空行,返回true

我认为是
\s
在字符类中不起作用。这是一个字符类。@Gene:它确实有效,例如
\w
。@Gene:我一开始也这么想,但发现它确实有效。干杯你说得对。嵌入在其他字符类中的字符类只是形成了联合。我在角色类中得到了它。请参见下文。这将匹配任何以空格开头的行。@sza:就是这样:我就在
之外。谢谢。问题仍然存在:
*
0或更多那么为什么仍然需要额外的
?干杯@MacUsers点匹配任何单个字符,星形是无限重复的。因此,
*
匹配到目前为止其他测试的任何东西,并且确实有效,但尝试了解它是如何工作的。因此,在行首匹配零个或多个空格是很重要的:
^
-它包括空行/空行,但是对于以
开头的行,这又是如何工作的呢?那
\s*
(\\\#|$)
是否作为或工作?干杯@MacUsers我用一个散文式的解释扩展了答案,我相信它回答了您的后续问题。希望有帮助。谢谢!不知道
\s
也包括“一点都不知道”。顺便问一下,那是用来做什么的?干杯这与前导空格的注释行不匹配。
open('foo.txt', 'r').each { |ln| ln.chomp!; puts ln if ln =~ /\A\s*[^#\s]/ }
/
  ^      # match start of line
  \s*    # match zero or more spaces
  (\#|$) # match comment symbol or end-of-line
/x
/^\s*(#|$)/