Rubyの文字クラスで「バックスラッシュ以外のすべての記号」と言うにはどうすればよいですか?
/'[^\]*'/.match("'some string \ hello'") => should be nil
バックスラッシュが 2 つあるバリアントが機能しない
/'[^\\]*'/.match("'some string \ hello'") => 'some string \ hello' BUT should be nil
問題は正規表現ではありません。あなたはその権利を得ました。問題は、テスト文字列にバックスラッシュが含まれていないことです。代わりに、エスケープされたスペースがあります。これを試して:
str = "'some string \\ hello'"
puts str #=> 'some string \ hello'
p /'[^\\]*'/.match(str) #=> nil
バックスラッシュをエスケープする必要があります。
[^\\]*
バックスラッシュは正規表現のエスケープ文字であるため、ここで閉じ括弧をエスケープします。
文字列全体にバックスラッシュ以外の文字が含まれていることを確認する場合は、アンカーが必要です。
^[^\\]*$
実際には、照合する文字列にバックスラッシュはありません。あなたの入力だけを見てみてください:
"'some string \ hello'".length # => 20
"a\ b".length # => 3
二重引用符で囲まれた "\ " は、スペースだけにエスケープされています。
irb(main):014:0> " "[0].to_i # => 32
irb(main):015:0> "\ "[0].to_i # => 32
irb(main):016:0> "\ ".size #=> 1
スラッシュなしで一致させたい場合は、2 番目の例のように 2 つ必要です。
/'[^\\]*'/.match("'some string \\ hello'") # => nil