2011-12-13 26 views
7

名前から名字、姓から姓、場合によってはARBのような頭字語のように、人間が読めるようにする必要がある単語のリストがあります。後者は最近導入され、正規表現でAR Bsが返されるため、表示問題が発生しました。頭字語の中でどこが、彼らは文字列では動作し、私はSO上と頭字語で作業することができ、他のサイト上の他の表現を見つけた頭字語を除いて分割されたPascalCase文字列

([A-Z][a-z]+) 

:ここでは、頭字語のために不十分である私が知っている、持っているものです文字列全体ではなく文字列。私は単純な正規表現を行うことができますが、これは私のスキルにとってはあまりにも難しいことです。私はそれらを持っていればテストのための他の例を提供するだろうが、文字列のすべては新しいものを除いてうまくいく、ARBs。ありがとうございました。

アップデート:ここでは、コードの使用は[A-Z]+[a-z]*がそれをしないだろう

string friendlyName = Regex.Replace(field.Name, "([A-Z][a-z]+)", " $1", RegexOptions.Compiled).Trim(); 
+0

残念ながら、この問題は未解決曖昧になっている可能性があり、例えば 'ConfigureIDEAsUser'は、または「設定IDEASユーザー」「ユーザとして設定IDE」に分割しますか? –

答えて

12

ですか?これは、1つ以上の大文字とそれに続く0個以上の小文字が一致する必要があります。したがって、ARBsは単一のエンティティのままですが、CamelCaseCamel Caseに分割されます。

+0

私はそれが簡単だったとは信じられません...ありがとうございます! – Mathachew

+0

すばらしい解決策。 「HereIsGPSData」を「こちらはGPSデータですか」にする方法はありますか?どこが難しいか分かります。しかし、大文字の後に小文字がある場合、頭文字のアッパーは頭字語の一部ではないと仮定します。 – Grandizer

+1

実際にそれを考え出した。 (?<!^)([AZ] [az] |(?<= [az])[AZ])これは[こちら]から取得しました(http://www.codeproject.com/Articles/108996/Splitting- – Grandizer

0

これはいかがですか?

[A-Z][a-z]+|[A-Z] 
0

頭字語を含む文字列/段落/文は、人間が判読できる文章/文字列に変換できます。 私はPascal Casesの文字列を書式化しようとしていましたが、もっと調査して頭字語を理解しやすい形式に変換しようとしました。

試験データ

入力: "QWERTYSomeThing OmitTRYSomeThing MayBeWorkingFYI"

出力: "いくつかのこと省略はいくつかのことをお試しくださいQWERTYはFYI仕事ができることがある"

コード: 入力文字列をメソッドに渡します。

private static string FormatPascalAndAcronym(string input) 
    { 
     var builder = new StringBuilder(input[0].ToString()); 
     if (builder.Length > 0) 
     { 
      for (var index = 1; index < input.Length; index++) 
      { 
       char prevChar = input[index - 1]; 
       char nextChar = index + 1 < input.Length ? input[index + 1] : '\0'; 

       bool isNextLower = Char.IsLower(nextChar); 
       bool isNextUpper = Char.IsUpper(nextChar); 
       bool isPresentUpper = Char.IsUpper(input[index]); 
       bool isPrevLower = Char.IsLower(prevChar); 
       bool isPrevUpper = Char.IsUpper(prevChar); 

       if(!string.IsNullOrWhiteSpace(prevChar.ToString()) && 
        ((isPrevUpper&& isPresentUpper && isNextLower) || 
        (isPrevLower&&isPresentUpper&&isNextLower)|| 
        (isPrevLower&&isPresentUpper&&isNextUpper))) 
       { 
        builder.Append(' '); 
        builder.Append(input[index]); 
       } 
       else{ 
       builder.Append(input[index]); 
       } 
      } 
     } 
     return builder.ToString(); 
    } 
+0

これは、質問に記載されている唯一のテストケースでは間違ったことです。それは他の人にとってはおそらく正しいルールです。 –