2012-02-23 2 views
2

ColdFusionを使用して、私は次のように、人間が読める文字列にキャメルケースの文字列を変換したい:camelCaseを空白文字列に変換するにはどうすればよいですか? (例えばキャメルケース「キャメルケース」へ)

のfirstName - > [名

また、これは理想的に行われますすべてインラインで、Ucase(rereplace('myCamelCaseString',[regex]," "))のようなものです。インラインが不可能な場合は、おそらくUDFですか?

+0

なお、私はこれで終わるに対するAl-エベレットと@ phontom42 @からのコードを組み合わせることができた: '#uCase(左(rereplace(element.name、 "([AZ])"、」 len(rereplace(element.name、 "([AZ])"、 "rereplace(element.name、"([AZ]) "、" AZ))、 "\ 1"、 "all")) - 1)# ' しかし、それほどエレガントではありません。おそらくUDFソリューションと一緒に行くだろう。 – eterps

答えて

10

#rereplace("camelCaseString","([A-Z])"," \1","all")#

編集:以下のバージョンは小文字の最初の文字を処理します。ここで

#rereplace(rereplace("camelCaseString","(^[a-z])","\u\1"),"([A-Z])"," \1","all")#

+0

これは非常に近いですが、最初の文字を大文字にしません。 – eterps

+0

は、必要に応じてそれを処理するために編集しました。 2つの答えを組み合わせようとするよりもはるかに簡単です。 –

+0

魅力的な作品です。ありがとう! – eterps

-3

再帰/反復をサポートしていないので、正規表現を使って一度に行うことはできないと思うので、任意の数のwordsPushedTogetherを使用して文字列で動作させることはできません。

空白の文字列で始まり、camelCase文字列をループし、大文字を見つけるたびにその前の文字を分割して新しい文字列にスペースをつけて追加するループができます。

+0

私が使ったRegExのすべてのフレーバは、グローバルフラグを持っています。 CFでは、文字列内の1つの一致またはすべての一致を検索するかどうかを選択できます。 –

4

CFLibはあなたの友人です!

camelToSpace()大文字にすることを除いて、あなたが求めていることを実行します。あなたは結果の文字列の各単語を大文字にしたい場合は

<cfscript> 
/** 
* Breaks a camelCased string into separate words 
* 8-mar-2010 added option to capitalize parsed words Brian Meloche [email protected] 
* 
* @param str  String to use (Required) 
* @param capitalize  Boolean to return capitalized words (Optional) 
* @return Returns a string 
* @author Richard ([email protected]@trilobiet.nl) 
* @version 0, March 8, 2010 
*/ 
function camelToSpace(str) { 
    var rtnStr=lcase(reReplace(arguments.str,"([A-Z])([a-z])","&nbsp;\1\2","ALL")); 
    if (arrayLen(arguments) GT 1 AND arguments[2] EQ true) { 
     rtnStr=reReplace(arguments.str,"([a-z])([A-Z])","\1&nbsp;\2","ALL"); 
     rtnStr=uCase(left(rtnStr,1)) & right(rtnStr,len(rtnStr)-1); 
    } 
return trim(rtnStr); 
} 
</cfscript> 

、あなたが代わりにこれらのUDFを持っていたら、あなたが行うことができ、そうCapFirstTitle()

<cfscript> 
/** 
* Returns a string with words capitalized for a title. 
* Modified by Ray Camden to include var statements. 
* Modified by James Moberg to use structs, added more words, and reset-to-all-caps list. 
* 
* @param initText  String to be modified. (Required) 
* @return Returns a string. 
* @author Ed Hodder ([email protected]) 
* @version 3, October 7, 2011 
*/ 
function capFirstTitle(initText){ 
     var j = 1; var m = 1; 
     var doCap = true; 
     var tempVar = ""; 
     /* Make each word in text an array variable */ 
     var Words = ListToArray(LCase(trim(initText)), " "); 
     var excludeWords = structNew(); 
     var ResetToALLCAPS = structNew(); 
     /* Words to never capitalize */ 
     tempVar = ListToArray("a,above,after,ain't,among,an,and,as,at,below,but,by,can't,don't,for,from,from,if,in,into,it's,nor,of,off,on,on,onto,or,over,since,the,to,under,until,up,with,won't"); 
     for(j=1; j LTE (ArrayLen(tempVar)); j = j+1){ 
       excludeWords[tempVar[j]] = 0; 
     } 
     /* Words to always capitalize */ 
     tempVar = ListToArray("II,III,IV,V,VI,VII,VIII,IX,X,XI,XII,XIII,XIV,XV,XVI,XVII,XVIII,XIX,XX,XXI"); 
     for(j=1; j LTE (ArrayLen(tempVar)); j = j+1){ 
       ResetToALLCAPS[tempVar[j]] = 0; 
     } 
     /* Check words against exclude list */ 
     for(j=1; j LTE (ArrayLen(Words)); j = j+1){ 
       doCap = true; 
       /* Word must be less than four characters to be in the list of excluded words */ 
       if(LEN(Words[j]) LT 4){ 
         if(structKeyExists(excludeWords,Words[j])){ doCap = false; } 
       } 
       /* Capitalize hyphenated words */ 
       if(ListLen(trim(Words[j]),"-") GT 1){ 
         for(m=2; m LTE ListLen(Words[j], "-"); m=m+1){ 
           tempVar = ListGetAt(Words[j], m, "-"); 
           tempVar = UCase(Mid(tempVar,1, 1)) & Mid(tempVar,2, LEN(tempVar)-1); 
           Words[j] = ListSetAt(Words[j], m, tempVar, "-"); 
         } 
       } 
       /* Automatically capitalize first and last words */ 
       if(j eq 1 or j eq ArrayLen(Words)){ doCap = true; } 
       /* Capitalize qualifying words */ 
       if(doCap){ Words[j] = UCase(Mid(Words[j],1, 1)) & Mid(Words[j],2, LEN(Words[j])-1); } 
       if (structKeyExists(ResetToALLCAPS, Words[j])) Words[j] = ucase(Words[j]); 
     } 
     return ArrayToList(Words, " "); 
} 
</cfscript> 

あります

CapFirstTitle(camelToSpace('myCamelCaseString')) 

れます返信My Camel Case String

0

キャメルケースに単語の文字列を変換するために一緒に働く二つの機能があります。単語はスペースやアンダースコアで区切ることができますが、必要に応じて他の文字を追加できます。

<cffunction name="camelCase" access="public" output="false" returntype="string"> 
    <cfargument name="sourceString" type="string" required="true"> 
    <cfscript> 
     var s = LCase(Trim(arguments.sourceString)); 
     s = camelCaseByWordSeperator(s, " "); 
     s = camelCaseByWordSeperator(s, "_"); 
     return s; 
    </cfscript> 
</cffunction> 

<cffunction name="camelCaseByWordSeperator" access="private" output="false" returntype="string"> 
    <cfargument name="sourceString" type="string" required="true"> 
    <cfargument name="separator" type="string" required="false" default="_"> 
    <cfscript> 
     var s = arguments.sourceString; 
     var wordBreakPos = Find(arguments.separator, s); 
     while (wordBreakPos gt 0) { 
      lens = Len(s); 
      if (wordBreakPos lt lens) { 
       s = Replace(Left(s, wordBreakPos), arguments.separator, "", "all") & UCase(Mid(s, wordBreakPos+1, 1)) & Right(s, lens - wordBreakPos - 1); 
      } else { 
       s = Replace(s, arguments.separator, "", "all"); 
      } 
      wordBreakPos = Find(arguments.separator, s); 
     } 
     return s; 
    </cfscript> 
</cffunction>