2016-04-16 17 views
1

私はフリーコードキャンプからこのコードチャレンジSpinal Tap Caseに執着しています。本質的に私は最終チェックを実行する方法を知らない。Javascriptで文字列を脊髄のケースに変換するにはどうすればよいですか?

これが最後のチェックです: spinalCase("AllThe-small Things") should return "all-the-small-things"

そして、これは私のコードです:

function spinalCase(str) { 
    var outputString, 
       newstr, 
       pattern1 = new RegExp(/[_\s]/, 'g'), 
       pattern2 = new RegExp(/(?=[A-Z])/, 'g'), 
       stringTest1 = pattern1.test(str), 
       stringTest2 = pattern2.test(str); 

     if(stringTest1) { 
       outputString = str.replace(pattern1, '-'); 
       newstr = outputString.toLowerCase(); 
      } else if(stringTest2) { 
       str.split(/(?=[A-Z])/).join(' '); 
       outputString = str.replace(pattern2, '-'); 
       newstr = outputString.toLowerCase(); 
      } else if (stringTest1 && stringTest2){ 
       outputString = str.replace(pattern1, '-'); 
       outputString = str.replace(pattern2, '-'); 
       newstr = outputString.toLowerCase(); 
      } 

    return newstr; 

} 

私は、構文の権利を取得していないが、最後のelse if条件が最初に行くべきで実現します。

ありがとうございます!ここで

答えて

2

が、私はそれをやってお勧めする方法である:

function sp(str) { 
    var spinal = str.replace(/(?!^)([A-Z])/g, ' $1') 
       .replace(/[_\s]+(?=[a-zA-Z])/g, '-').toLowerCase(); 
    return spinal 
} 

JsBin Example

を限り、あなたのコードのように、あなたがチェック:test1else if test2場合

、その後else if test1 and test2、ロジックが正しくありません:

!test2またはを追加しようとする可能性があります最初にをチェックし、それが作業を取得する場合:

if (stringTest1 && !stringTest2)... 

EDIT:

ここ

は、あなたが、私は示すために、そこにはconsole.logを置けば、あなたのコードが他のその最後に起動するように得ることができる方法でありますここにあなた:

JSBin Example

function spinalCase(str) { 
    var outputString, 
       newstr, 
       pattern1 = new RegExp(/[_\s]/, 'g'), 
       pattern2 = new RegExp(/(?=[A-Z])/, 'g'), 
       stringTest1 = pattern1.test(str), 
       stringTest2 = pattern2.test(str); 

     if(stringTest1 && !stringTest2) { 
       outputString = str.replace(pattern1, '-'); 
       newstr = outputString.toLowerCase(); 
      } else if(!stringTest1 && stringTest1) { 
       str.split(/(?=[A-Z])/).join(' '); 
       outputString = str.replace(pattern2, '-'); 
       newstr = outputString.toLowerCase(); 
      } else if (stringTest1 && stringTest2){ 
       console.log('were in the last else!!!'); 
       outputString = str.replace(pattern1, '-'); 
       outputString = str.replace(pattern2, '-'); 
       newstr = outputString.toLowerCase(); 
      } 

    return newstr; 

} 
+0

のために働きますコードをあなたの洞察力と一緒に使うことができます。非常にエレガント。私はあなたのソリューションを掘り下げなければならないでしょう。私はそれを得ると思うが。私はあなたがそのような方法を連鎖させることができるのか分からなかった。助けてくれてありがとう、ジョーダン! –

+1

私はそれを刺すように答えを編集しましょう! – JordanHendrix

+0

ありがとうございますが、それはうまくいきません。 最後の条件は実際には発生しますが、関数全体では答えと同じ結果が得られません。あなたの解決策が何をしているのか少し説明してください。 私のtakeは以下の通りです: 最初に 'replace 'を使って' A-Z'という大文字をチェックする最初の式と '(?!^)'と '$ 1'をチェックします。そして、私はあなたがそれらを式にするために '(...)'でラップしていると仮定します。なぜなら、インタプリタかもしれないので、そうしなければエラーを返すでしょうか? –

0
function spinalCase(str) { 

    // Create a variable for the white space and underscores 
    var regex = /\s+|_+/g; 

    // Replace low-upper case to low-space-uppercase 
    str = str.replace(/([a-z])([A-Z])/g, '$1 $2'); 

    // Replace space and underscore with dashes 
    return str.replace(regex, '-').toLowerCase(); 

} 
1

ここに私の解決策だ、少し少ないheav正規表現上のY:

function spinalCase(str) { 
    var newStr = str[0]; 

    for (var j = 1; j < str.length; j++) { 
    // if not a letter make a dash 
    if (str[j].search(/\W/) !== -1 || str[j] === "_") { 
     newStr += "-"; 
    } 
    // if a Capital letter is found 
    else if (str[j] === str[j].toUpperCase()) { 
     // and preceded by a letter or '_' 
     if (str[j-1].search(/\w/) !== -1 && str[j-1] !== "_") { 
     // insert '-' and carry on 
     newStr += "-"; 
     newStr += str[j]; 
     } 
     else { 
     newStr += str[j]; 
     } 
    } 
    else { 
     newStr += str[j]; 
    } 
    } 

    newStr = newStr.toLowerCase(); 
    return newStr; 
} 
1
function spinalCase(str) { 

    // any string followed by upperCase letter 
    var re = /(?=[A-Z])/g; 

    // any string followed by space and upperCase/lowerCase letter 
    var re2=/(?=\s[A-Z]|\s[a-z])/g; 

    // any string of 2 or more '-' 
    var re3 = new RegExp("-{2,}", "g"); 

    var space = new RegExp(" ","g"); 
    var hyphen = new RegExp("_","g"); 

    str = str.replace(hyphen,"-"); 
    str = str.replace(re, '-'); 
    str = str.replace(re2,"-"); 
    str = str.replace(re3,"-"); 
    str = str.replace(space,""); 
    str = str.toLowerCase(); 
    if(str.slice(0,1)== '-'){ 
    str = str.replace("-",""); 
    }  
    return str; 
} 

spinalCase('This Is Spinal Tap'); 
3

はここに-Iが私を強化する方法を見つけ出すことができなかった正規表現を持つ単純な、私の解決策だと、すべての場合

function spinalCase(str) { 
    return str.replace(/([A-Z])/g,' $1') /*Find all cap and add space at the start*/ 
     .replace(/[^A-Za-z0-9]/g,' ') /*Find all non alpha numeric and replace it with space*/ 
     .replace(/\s{1,}/g,"-") /*Convert all spaces to -*/ 
     .replace(/^\-|[\-]$/g,'') /*Slice - at the start and end*/ 
     .toLowerCase(); /*LowerCase it*/ 
} 
1
function spinalCase(str) { 
    var newStr = ''; 
    var arr = str.split(''); 
    for (var i = 0; i < arr.length; i += 1) { 
    if (i > 0) { 
     if (arr[i] >= 'A' && arr[i] <= 'Z') { 
     if (arr[i - 1] >= 'a' && arr[i - 1] <= 'z') { 
      newStr += '-'; 
      newStr += arr[i].toLowerCase(); 
      continue; 
     } 
     } 
     else if (arr[i] === ' ' || arr[i] === '_') { 
     newStr += '-'; 
     continue; 
     } 
    } 
    newStr += arr[i].toLowerCase(); 
    } 
    return newStr; 
} 

spinalCase("AllThe-small Things"); 
1
function spinalCase(str) { 
//Split the string at one of the following conditions 
     //a whitespace character [\s] is encountered 
     //underscore character [_] is encountered 
     //or by an uppercase letter [(?=[A-Z])] 
//Join the array using a hyphen (-) 
//Lowercase the whole resulting string 

    return str.split(/\s|_|(?=[A-Z])/).join('-').toLowerCase(); 

} 
関連する問題