[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

non case sensitive searching

Adam Akhtar

2/11/2008 9:19:00 PM

If i want to see if a list contains a particular word how would i go
about doing so with letter case not being important. Normally two words
spelt the same are not equal if they differ in case.

i.e. Shell != shell
or ShEll != shell

At first i thought simply conveting both the list and the word to search
into uppercase thus making them the same but doing so would not be very
efficient if the list is very big.

Any ideas??
--
Posted via http://www.ruby-....

14 Answers

Stefano Crocco

2/11/2008 9:24:00 PM

0

Alle Monday 11 February 2008, Adam Akhtar ha scritto:
> If i want to see if a list contains a particular word how would i go
> about doing so with letter case not being important. Normally two words
> spelt the same are not equal if they differ in case.
>
> i.e. Shell != shell
> or ShEll != shell
>
> At first i thought simply conveting both the list and the word to search
> into uppercase thus making them the same but doing so would not be very
> efficient if the list is very big.
>
> Any ideas??

Use String#casecmp. According to ri documentation, it works as String#<=> but
is not case sensitive. For example:

"abc" <=> "Abc"
=> 1

"abc".casecmp "Abc"
=> 0

Stefano


Robert Klemme

2/11/2008 9:28:00 PM

0

On 11.02.2008 22:19, Adam Akhtar wrote:
> If i want to see if a list contains a particular word how would i go
> about doing so with letter case not being important. Normally two words
> spelt the same are not equal if they differ in case.
>
> i.e. Shell != shell
> or ShEll != shell
>
> At first i thought simply conveting both the list and the word to search
> into uppercase thus making them the same but doing so would not be very
> efficient if the list is very big.

search_key = something.downcase
list.find {|s| s.downcase == search_key}

robert

7stud --

2/11/2008 9:31:00 PM

0

Adam Akhtar wrote:
> If i want to see if a list contains a particular word how would i go
> about doing so with letter case not being important. Normally two words
> spelt the same are not equal if they differ in case.
>
> i.e. Shell != shell
> or ShEll != shell
>
> At first i thought simply conveting both the list and the word to search
> into uppercase thus making them the same but doing so would not be very
> efficient if the list is very big.
>
> Any ideas??

data = ['ShEll', 'heLLO']

data.each do |word|
if /shell/i =~ word
puts 'found shell'
end

if /hello/i =~ word
puts 'found hello'
end
end

--
Posted via http://www.ruby-....

William James

2/11/2008 9:45:00 PM

0

On Feb 11, 3:19 pm, Adam Akhtar <adamtempor...@gmail.com> wrote:
> If i want to see if a list contains a particular word how would i go
> about doing so with letter case not being important. Normally two words
> spelt the same are not equal if they differ in case.
>
> i.e. Shell != shell
> or ShEll != shell
>
> At first i thought simply conveting both the list and the word to search
> into uppercase thus making them the same but doing so would not be very
> efficient if the list is very big.

>> irb --prompt xmp
%w(hello HELLO Hello hellO hell).grep( /hello/i )
==>["hello", "HELLO", "Hello", "hellO"]

Adam Akhtar

2/11/2008 11:08:00 PM

0

the reg exp. looks good but when i try to apply it to help me romove
duplicates from a list it doesnt seem to work

list = %w{adam Adam bobby Bobby wild wILd}
list.sort
list.each_index do |x|
list.delete_at(x) if (/list[x]/i =~ list[x+1]) #remove entries which
have same spelling but in diff. case
end
puts ""
puts list

in this list i consider adam and Adam duplicates because they have the
same spelling but only different case. Why doesnt my if clause pick up
on this?

--
Posted via http://www.ruby-....

Alex Fenton

2/11/2008 11:15:00 PM

0

Adam Akhtar wrote:
> the reg exp. looks good but when i try to apply it to help me romove
> duplicates from a list it doesnt seem to work
>
> list = %w{adam Adam bobby Bobby wild wILd}
> list.sort
> list.each_index do |x|
> list.delete_at(x) if (/list[x]/i =~ list[x+1])

here you're literally searching for the text "list[x]", not the value of
that expression. You need to use interpolation to place the value of
that variable into the regular expression. Use #{expr}, like you would
in a string:

list.delete_at(x) if ( /#{list[x]}/i =~ list[x+1])

If your strings might contain punctuation characters, you should also
look into Regexp.escape to ensure these are dealt with safely.

alex

Adam Akhtar

2/12/2008 12:04:00 AM

0

excellent thanks very much alex for that.
--
Posted via http://www.ruby-....

Robert Klemme

2/12/2008 7:45:00 AM

0

2008/2/12, Adam Akhtar <adamtemporary@gmail.com>:
> the reg exp. looks good but when i try to apply it to help me romove
> duplicates from a list it doesnt seem to work
>
> list = %w{adam Adam bobby Bobby wild wILd}
> list.sort

The line above is ineffective because you do not sort the original list.

> list.each_index do |x|
> list.delete_at(x) if (/list[x]/i =~ list[x+1]) #remove entries which
> have same spelling but in diff. case
> end
> puts ""
> puts list

I would use another algorithm because of efficiency:

#!/bin/env ruby

require 'set'

# ensure random order
list = %w{adam Adam bobby Bobby wild wILd}.sort_by { rand }
dups = Set.new

p list
list.delete_if {|w| not dups.add? w.downcase }
p list

Kind regards

robert


--
use.inject do |as, often| as.you_can - without end

William James

2/12/2008 8:33:00 AM

0

On Feb 12, 1:45 am, Robert Klemme <shortcut...@googlemail.com> wrote:
> 2008/2/12, Adam Akhtar <adamtempor...@gmail.com>:
>
> > the reg exp. looks good but when i try to apply it to help me romove
> > duplicates from a list it doesnt seem to work
>
> > list = %w{adam Adam bobby Bobby wild wILd}
> > list.sort
>
> The line above is ineffective because you do not sort the original list.
>
> > list.each_index do |x|
> > list.delete_at(x) if (/list[x]/i =~ list[x+1]) #remove entries which
> > have same spelling but in diff. case
> > end
> > puts ""
> > puts list
>
> I would use another algorithm because of efficiency:
>
> #!/bin/env ruby
>
> require 'set'
>
> # ensure random order
> list = %w{adam Adam bobby Bobby wild wILd}.sort_by { rand }
> dups = Set.new
>
> p list
> list.delete_if {|w| not dups.add? w.downcase }
> p list

We don't need sets for this.

list = %w{adam Adam bobby Bobby wild wILd}.sort_by { rand }
==>["wild", "bobby", "Bobby", "wILd", "Adam", "adam"]
list.map{|x| x.upcase}.uniq
==>["WILD", "BOBBY", "ADAM"]

First "inject"; now, a set fetish?

7stud --

2/12/2008 9:02:00 AM

0

Adam Akhtar wrote:
> the reg exp. looks good

You should never consider a regex good looking. regexes should be
avoided whenever possible in favor of String methods. Better solutions
have been posted.


Robert Klemme wrote:
> I would use another algorithm because of efficiency:
>
> list.delete_if

Repeatedly deleting elements from the middle of an array is certainly
not efficient. Also, suppose the results are:

[Adam Bobby wILd]

Looking at the results, you would have no way of knowing whether there
were duplicates spelled: adam, bobby, and wild. Therefore, the case of
the results appears to be irrelevant. If the case of the results is
irrelevant, then just providing the set is enough:


require 'set'

# ensure random order
list = %w{adam Adam bobby Bobby wild wILd}.sort_by { rand }

results = Set.new
list.each do |elmt|
results << elmt.downcase
end

p results

--output:--
#<Set: {"bobby", "wild", "adam"}>


--
Posted via http://www.ruby-....