Re: More efficient regex

2007-02-28 Thread Chris Wagner
I'm guessing that u want to cannocalize the capitalization of string words
right?  Like BOB JONES -> Bob Jones.  There is a faster way to check for
mixed casedness.

%tolowers = map {$_, 1} ('A', 'The', 'If', 'Is', 'It', 'Of', 'Our',
'An','On', 'In', 'But', 'With', 'Has', 'Had', 'Have');
%touppers = map {$_, 1} ('N','S','E','W','NE','NW','SE','SW','PO','BOX');
$uppers = $text =~ tr/A-Z/A-Z/; #count uppercase letters
$lowers = $text =~ tr/a-z/a-z/; #count lowercase letters

if ($uppers and not $lowers) { #all upper case
&fixcase($text);
}
elsif ($lowers and not $uppers) { #all lower case
&fixcase($text);
}

sub fixcase {
my $text = $_[0];
my @text = map {ucfirst(lc($_))} split / /, $text;
foreach $i (@text) { $tolowers{$i} and $i = lc $i; }
foreach $i (@text) { $touppers{uc $i} and $i = uc $i; }
$text = join " ", @text;
# do whatever else
return $text;
}

That should do it and be about as efficient as possible. :)  If u have to
deal with sentences then u'll need a few more lines to deal with periods and
commas.

These O'Reilly gems are useful too.
Finding all-caps words 
@capwords = m/(\b[^\Wa-z0-9_]+\b)/g;
Finding all-lowercase words 
@lowords = m/(\b[^\WA-Z0-9_]+\b)/g;
Finding initial-caps word 
@icwords = m/(\b[^\Wa-z0-9_][^\WA-Z0-9_]*\b)/;

At 12:12 PM 2/28/2007 -0500, Chris O wrote:
>In the sample below, I'm checking $foo for all caps or all lowercase. Is
>there a more efficient regex method?
>
>$foo='APPLE JONES PARKER';
>
>if(($foo!~/[A-Z]/)or($foo!~/[a-z]/)){
>   $foo=&title_case($foo);
>}
>
>print $foo."\n";
>
>sub title_case{
>  my($string) = @_;
>  my @exception_words = ('A', 'The', 'If', 'Is', 'It', 'Of', 'Our',
>'An','On', 'In', 'But', 'With', 'Has', 'Had', 'Have');
>  my @exception_stuff = ('N','S','E','W','NE','NW','SE','SW','PO','BOX');
>  
>  $string =~ s/([\w']+)/\u\L$1/g;
>  foreach(@exception_words){$string =~ s/\b$_\b/lc($_)/ge;} # Make Exception
>Words LC
>  foreach(@exception_stuff){$string =~ s/\b$_\b/$_/gei;} # Make Exception
>Stuff Correct Case
>  
>  $string =~ s/(.)/\u$1/; # Uppercase the first letter
>  return $string;
>}



--
REMEMBER THE WORLD TRADE CENTER ---=< WTC 911 >=--
"...ne cede malis"

0100

___
Perl-Win32-Users mailing list
Perl-Win32-Users@listserv.ActiveState.com
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs


More efficient regex

2007-02-28 Thread Chris O

Gurus,

In the sample below, I'm checking $foo for all caps or all lowercase. Is
there a more efficient regex method?

- Chris



$foo='APPLE JONES PARKER';

if(($foo!~/[A-Z]/)or($foo!~/[a-z]/)){
$foo=&title_case($foo);
}

print $foo."\n";




sub title_case{
  my($string) = @_;
  my @exception_words = ('A', 'The', 'If', 'Is', 'It', 'Of', 'Our',
'An','On', 'In', 'But', 'With', 'Has', 'Had', 'Have');
  my @exception_stuff = ('N','S','E','W','NE','NW','SE','SW','PO','BOX');
  
  $string =~ s/([\w']+)/\u\L$1/g;
  foreach(@exception_words){$string =~ s/\b$_\b/lc($_)/ge;} # Make Exception
Words LC
  foreach(@exception_stuff){$string =~ s/\b$_\b/$_/gei;} # Make Exception
Stuff Correct Case
  
  $string =~ s/(.)/\u$1/; # Uppercase the first letter
  return $string;
}

___
Perl-Win32-Users mailing list
Perl-Win32-Users@listserv.ActiveState.com
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs