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。

私は2つのステップで別々に行うことができます:

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*、行頭の直後の任意の量の空白 (まったくないものも含む) が一致できることを意味します。(\#|$)代替を使用するため、括弧内のパターンのいずれかが一致する可能性があります。注意: バックスラッシュは、正規表現の空白とコメントを無視するオプションを使用する場合にコメント記号をエスケープするためにのみ必要です。使用しない場合は、バックスラッシュを省略してください。x x

したがって、このパターンは行頭とそれに続くオプションの空白に一致し、その直後にコメント記号または行末が続く必要があります。一致はanchoredであるため、またはのような文字列は必要なパターンと一致しないため、一致しません"foo # bar"" 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 に答える
0

/^[\s#].*$/を使用.して、任意の文字に一致させる必要があると思います。

于 2013-08-20T14:52:59.110 に答える
0

特にJavaで私のために働いた

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

「#」の前の任意の空白と、空白だけの空の行を考慮します。そう

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

すべてのコメント行と空行に対して true を返します。

于 2013-11-28T17:21:33.193 に答える
0
open(inFile, 'r').each { |ln|  puts ln if ln !~ /^(\s+|#.+)$/ }

この正規表現は、行末までの任意の量の空白文字、または行末までの任意の文字が続くハッシュ記号を探します。[\s#]* は、0 個以上の空白文字またはハッシュ記号を検索すると思います。ハッシュ記号の後の任意の文字を一致として検索します。

于 2013-08-20T15:11:59.627 に答える
0

あなたが探していた文字クラスのアプローチに戻るには...

行全体を一致させる必要はありません。最初の非スペースまでの部分だけが必要です。

したがって、コメント文字以外で終わるスペースの先頭のプレフィックスを一致させるという考え方です。マッチャーはバックトラックするため、一致の最後の文字が空白であることも禁止する必要があります。

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

コメント文字の前に先頭のスペースを許可することを想定しています。ファイルを正確に再生するには、改行を切り詰めることを忘れないでください。

于 2013-08-20T15:15:07.990 に答える