2017-08-03 12 views
0

:私はにそれを変換したい私は(これを除く)この文字列を大文字にしたい大文字すべての私は内部の括弧を文字列が含まれてい括弧の外の文字

と(この)

私は(これを除く)この文字列を大文字にしたいAND(この)

JavaScriptで行う最良の方法は何ですか?私は正規表現を使用する必要がある場合は、私は正規表現がよくないので、明確に説明してください。あなたは正規表現を使用して、コールバック

var str = "I want to uppercase this string (except this) and (this)"; 
 
var res = str.replace(/[^()](?=([^()]*\([^()]*\))*[^()]*$)/g, t => t.toUpperCase()); 
 

 
console.log(res)

に置き換えることができます

+2

を使用するために迅速かつ汚い方法。あなたは、あなたが構築しているものと構築しているものについて、より具体的なものを与える必要があります。コードとあなたが試したことが分かるでしょう。 – zfrisch

答えて

1

敬具、正規表現がなければ、次の

NODE      EXPLANATION 
----------------------------------------- 
    [^()]     any character except: '(', ')' 
-------------------------------------------------------------------------------- 
    (?=      look ahead to see if there is: 
-------------------------------------------------------------------------------- 
    (      group and capture to \1 (0 or more times 
          (matching the most amount possible)): 
-------------------------------------------------------------------------------- 
     [^()]*     any character except: '(', ')' (0 or 
           more times (matching the most amount 
           possible)) 
-------------------------------------------------------------------------------- 
     \(      '(' 
-------------------------------------------------------------------------------- 
     [^()]*     any character except: '(', ')' (0 or 
           more times (matching the most amount 
           possible)) 
-------------------------------------------------------------------------------- 
     \)      ')' 
-------------------------------------------------------------------------------- 
    )*      end of \1 (NOTE: because you are using a 
          quantifier on this capture, only the 
          LAST repetition of the captured pattern 
          will be stored in \1) 
-------------------------------------------------------------------------------- 
    [^()]*     any character except: '(', ')' (0 or 
          more times (matching the most amount 
          possible)) 
-------------------------------------------------------------------------------- 
    $      before an optional \n, and the end of 
          the string 
-------------------------------------------------------------------------------- 
)      end of look-ahead 
-------------------------------------------------------------------------------- 
    /g      global 

を行います任意の正規表現イオン

var str = "I want to uppercase this string (except this) and (this)"; 
 
var par = false; 
 
var res = str.split('').map(function(c) { 
 
    par = c == '(' ? true : c == ')' ? false : par; 
 
    return par ? c : c.toUpperCase(); 
 
}).join('') 
 

 
console.log(res)

+0

正規表現以外の答えには素晴らしいフリップフロップがあります;)。おそらくまたpar = c === "(" ||(par && c!== ")") –

+0

@ジョナス - 素敵なゴルフ、小さなゴルフはいつも楽しいです - > https:// jsfiddle。net/adeneo/bLyrLk5v/ – adeneo

2

ケースを維持するために、次に括弧

var str = "I want to uppercase this string (except this) and (this)"; 

str = str.toUpperCase().replace(/(\(.+?)\)/g, m => m.toLowerCase()); 

間小文字を多くのことを大文字に単純なことがあります

var str = "I want to uppercase this string (eXcEpT ThIs) and (ThIS)"; 

str = str.toUpperCase().replace(/\((.+?\))/g, (m, c, o) => str.substr(o, m.length)); 

> I WANT TO UPPERCASE THIS STRING (eXcEpT ThIs) AND (ThIS) 
+3

元のテキストで括弧間のすべてが常に小文字のみであることが確かである場合にのみ、これは便利です。 * PS私はdownvoteをしませんでした。* –

+0

それは確かに本当です。 –

1

これは単純に次のようになります。

var str = 'I want to uppercase this string (except this) and (this)'; 
 

 
var repl = str.replace(/[a-z]+(?![^()]*\))/g, m => m.toUpperCase()) 
 

 
console.log(repl); 
 

 
//=> "I WANT TO UPPERCASE THIS STRING (except this) AND (this)"

これは、(を前提と)入力にバランスのとれたエスケープです。

否定先読み(?![^()]*\))は、我々は、間に無(または))が続いていない文字列に一致アサート。

1

は、おそらくより良い方法ですが、あなたにはJavaScript(文字列のメソッドやビット演算)やCSSや正規表現を使用することができません

var x = 'I want to uppercase this string (except this) and (this)'.replace(/(^[^(]+)|(\)[^(]+)/g, function (a,b) { return (a || b).toUpperCase()}) 
 
console.log(x)

関連する問題