Algorithm 将文本格式化为Pascal或驼峰大小写的算法

Algorithm 将文本格式化为Pascal或驼峰大小写的算法,algorithm,coding-style,camelcasing,pascalcasing,Algorithm,Coding Style,Camelcasing,Pascalcasing,作为基础,有一个alogrithm或编码示例将一些文本更改为Pascal或Camel大小写 例如: mynameisfred 变成 Camel: myNameIsFred Pascal: MyNameIsFred 要做到这一点,唯一的办法是在字典中查找单词的每一部分 “mynameisfred”只是一个字符数组,将其拆分为my Name is Fred意味着理解每个字符的连接意味着什么 如果您的输入以某种方式分开,例如“我的名字是fred”或“我的名字是fred”,您可以很容易地完成此操作。

作为基础,有一个alogrithm或编码示例将一些文本更改为Pascal或Camel大小写

例如:

mynameisfred
变成

Camel: myNameIsFred
Pascal: MyNameIsFred

要做到这一点,唯一的办法是在字典中查找单词的每一部分

“mynameisfred”只是一个字符数组,将其拆分为my Name is Fred意味着理解每个字符的连接意味着什么


如果您的输入以某种方式分开,例如“我的名字是fred”或“我的名字是fred”,您可以很容易地完成此操作。

我发现一个线程,其中有一群Perl人员正在讨论这个问题

我希望这不是一个太多的问题的答案,但我想说,你有一个问题,因为这将是一个非常开放的算法,可能有很多的'失误'以及点击。例如,假设您输入了:-

camelCase("hithisisatest");
输出可以是:-

"hiThisIsATest"
或:-

算法不可能知道该选择哪个。您可以添加一些额外的代码来指定您更喜欢更常见的单词,但同样会出现遗漏(Peter Norvig编写了一个非常小的拼写更正器,它可能有助于改进算法,我编写了一个if C#s your language)

我同意Mark的说法,你最好使用一种算法,它接受一个分隔的输入,也就是说,这个是一个测试并转换它。这很容易实现,即在伪代码中:-

SetPhraseCase(phrase, CamelOrPascal):
    if no delimiters
     if camelCase
      return lowerFirstLetter(phrase)
     else
      return capitaliseFirstLetter(phrase)
    words = splitOnDelimiter(phrase)
    if camelCase 
      ret = lowerFirstLetter(first word) 
     else
      ret = capitaliseFirstLetter(first word)
    for i in 2 to len(words): ret += capitaliseFirstLetter(words[i])
    return ret

capitaliseFirstLetter(word):
    if len(word) <= 1 return upper(word)
    return upper(word[0]) + word[1..len(word)]

lowerFirstLetter(word):
    if len(word) <= 1 return lower(word)
    return lower(word[0]) + word[1..len(word)]
SetPhraseCase(短语,CamelOrPascal):
如果没有分隔符
如果是骆驼案
返回下限首字母(短语)
其他的
返回资本家密码(短语)
单词=分词限制器(短语)
如果是骆驼案
ret=较低的首字母(第一个单词)
其他的
ret=资本家(第一个字)
对于2到len中的i(单词):ret+=大写字母(单词[i])
回程网
大写字母(word):
如果len(字)
SetPhraseCase(phrase, CamelOrPascal):
    if no delimiters
     if camelCase
      return lowerFirstLetter(phrase)
     else
      return capitaliseFirstLetter(phrase)
    words = splitOnDelimiter(phrase)
    if camelCase 
      ret = lowerFirstLetter(first word) 
     else
      ret = capitaliseFirstLetter(first word)
    for i in 2 to len(words): ret += capitaliseFirstLetter(words[i])
    return ret

capitaliseFirstLetter(word):
    if len(word) <= 1 return upper(word)
    return upper(word[0]) + word[1..len(word)]

lowerFirstLetter(word):
    if len(word) <= 1 return lower(word)
    return lower(word[0]) + word[1..len(word)]
using System;

class Program {
  static void Main(string[] args) {

    var caseAlgorithm = new CaseAlgorithm('_');

    while (true) {
      string input = Console.ReadLine();

      if (string.IsNullOrEmpty(input)) return;

      Console.WriteLine("Input '{0}' in camel case: '{1}', pascal case: '{2}'",
        input,
        caseAlgorithm.SetPhraseCase(input, CaseAlgorithm.CaseMode.CamelCase),
        caseAlgorithm.SetPhraseCase(input, CaseAlgorithm.CaseMode.PascalCase));
    }
  }
}

public class CaseAlgorithm {

  public enum CaseMode { PascalCase, CamelCase }

  private char delimiterChar;

  public CaseAlgorithm(char inDelimiterChar) {
    delimiterChar = inDelimiterChar;
  }

  public string SetPhraseCase(string phrase, CaseMode caseMode) {

    // You might want to do some sanity checks here like making sure
    // there's no invalid characters, etc.

    if (string.IsNullOrEmpty(phrase)) return phrase;

    // .Split() will simply return a string[] of size 1 if no delimiter present so
    // no need to explicitly check this.
    var words = phrase.Split(delimiterChar);

    // Set first word accordingly.
    string ret = setWordCase(words[0], caseMode);

    // If there are other words, set them all to pascal case.
    if (words.Length > 1) {
      for (int i = 1; i < words.Length; ++i)
        ret += setWordCase(words[i], CaseMode.PascalCase);
    }

    return ret;
  }

  private string setWordCase(string word, CaseMode caseMode) {
    switch (caseMode) {
      case CaseMode.CamelCase:
        return lowerFirstLetter(word);
      case CaseMode.PascalCase:
        return capitaliseFirstLetter(word);
      default:
        throw new NotImplementedException(
          string.Format("Case mode '{0}' is not recognised.", caseMode.ToString()));
    }
  }

  private string lowerFirstLetter(string word) {
    return char.ToLower(word[0]) + word.Substring(1);
  }

  private string capitaliseFirstLetter(string word) {
    return char.ToUpper(word[0]) + word.Substring(1);
  }
}