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*(#|$)/