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