Ariam
Ariam

Reputation: 75

Regular Expression matching in ruby, checking for white space

I am trying to check a file for white spaces at the beginning of each line. I want the white-space at the beginning of the line to be consistent, all start with spaces or all start with tabs. I wrote the code below but it isn't working for me. If there exist a space at a beginning of one line and then a tab exists in the beginning of another line print a warning or something.

    file = File.open("file_tobe_checked","r")  #I'm opening the file to be checked 

    while (line = file.gets)

    a=(line =~ /^ /).nil?  
    b=(line =~/^\t/).nil?

    if  a==false && b==false
    print "The white spaces at the beginning of each line are not consistent"
    end 

    end
    file.close

Upvotes: 1

Views: 217

Answers (3)

Cary Swoveland
Cary Swoveland

Reputation: 110675

I assume that no line can begin with one or more spaces followed by a tab, or vice-versa.

To merely conclude that there are one or more inconsistencies within the file is not very helpful in dealing with the problem. Instead you might consider giving the line number of the first line that begins with a space or tab, then giving the line numbers of all subsequent lines that begin with a space or tab that does not match the first line found with such. You could do that as follows (sorry, untested).

def check_file(fname)
  file = File.open(fname,"r") 
  line_no = 0
  until file.eof?
    first_white = file.gets[/(^\s)/,1]
    break if first_white
    line_no += 1
  end
  unless file.eof?
    puts "Line #{line_no} begins with a #{(first_white=='\t') ? "tab":"space"}"    
    until file.eof?
      preface = file.gets[/(^\s)/,1))]
      puts "Line #{line_no} begins with a #{(preface=='\t') ? "tab":"space"}" \
        if preface && preface != first_white
      line_no += 1
    end
  end
  file.close
end

Upvotes: 0

anitdas
anitdas

Reputation: 51

How important is it that you check for the whitespace (and warn/notify accordingly)? If you are aiming to just correct the whitespace, .strip is great at taking care of errant whitespace.

 lines_array = File.readlines(file_to_be_checked)

 File.open(file_to_be_checked, "w") do |f|
    lines_array.each do |line|
      # Modify the line as you need and write the result
      f.write(line.strip)
    end
 end

Upvotes: 0

konsolebox
konsolebox

Reputation: 75478

This is one solution where you don't read the file or the extracted lines array twice:

#!/usr/bin/env ruby
file = ARGV.shift
tabs = spaces = false
File.readlines(file).each do |line|
  line =~ /^\t/ and tabs = true
  line =~ /^ / and spaces = true
  if spaces and tabs
    puts "The white spaces at the beginning of each line are not consistent."
    break
  end
end

Usage:

ruby script.rb file_to_be_checked

And it may be more efficient to compare lines with these:

  line[0] == "\t" and tabs = true
  line[0] == ' ' and spaces = true

You can also prefer to use each_line over readlines. Perhaps each_line allows you to read the file line by line instead of reading all the lines in one shot:

File.open(file).each_line do |line|

Upvotes: 1

Related Questions