Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Restrict action of toLowerCase to part of a string?

I want to convert most of a string to lower case, except for those characters inside of brackets. After converting everything outside the brackets to lower case, I then want to remove the brackets. So giving {H}ell{o} World as input should give Hello world as output. Removing the brackets is simple, but is there a way to selectively make everything outside the brackets lower case with regular expressions? If there's no simple regex solution, what's the easiest way to do this in javascript?

like image 287
David Pfau Avatar asked Oct 04 '22 19:10

David Pfau


1 Answers

You can try this:

var str='{H}ell{o} World';

str = str.replace(/{([^}]*)}|[^{]+/g, function (m,p1) {
    return (p1)? p1 : m.toLowerCase();} );

console.log(str);

The pattern match:

{([^}]*)}  # all that is between curly brackets
           # and put the content in the capture group 1

|          # OR

[^{]+      # anything until the regex engine meet a {
           # since the character class is all characters but {

the callback function has two arguments:

m the complete match

p1 the first capturing group

it returns p1 if p1 is not empty else the whole match m in lowercase.

Details:

"{H}"    p1 contains H (first part of the alternation)
         p1 is return as it. Note that since the curly brackets are
         not captured, they are not in the result. -->"H"

"ell"    (second part of the alternation) p1 is empty, the full match 
         is returned in lowercase -->"ell"

"{o}"    (first part) -->"o"

" World" (second part) -->" world"
like image 122
Casimir et Hippolyte Avatar answered Oct 07 '22 19:10

Casimir et Hippolyte