Алгоритм форматирования текста в паскале или верблюжьем регистре

Используя этот вопрос в качестве основы - это пример алгоритма или кодирования для изменения некоторого текста на Pascal или Camel.

Например:

mynameisfred

становится

Camel: myNameIsFred
Pascal: MyNameIsFred
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
0
3 340
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Единственный способ сделать это - пропустить каждый раздел слова через словарь.

«mynameisfred» - это просто массив символов, разбиение его на мое имя - Фред означает понимание того, что означает объединение каждого из этих символов.

Вы могли бы сделать это легко, если бы ваш ввод был каким-то образом разделен, например «меня зовут фред» или «мое_имя_ис_фред».

Ответ принят как подходящий

Я нашел ветку с кучей парней из Perl, спорящих против этого вопроса на http://www.perlmonks.org/?node_id=336331.

Я надеюсь, что это не слишком большой отказ от ответа на вопрос, но я бы сказал, что у вас есть небольшая проблема в том, что это будет очень открытый алгоритм, который также может иметь много `` промахов '' как хиты. Например, скажем, вы ввели: -

camelCase("hithisisatest");

Результатом может быть: -

"hiThisIsATest"

Или же:-

"hitHisIsATest"

Алгоритм не знает, что предпочесть. Вы можете добавить дополнительный код, чтобы указать, что вы предпочитаете более общие слова, но снова будут промахи (Питер Норвиг написал очень маленький корректор орфографии в http://norvig.com/spell-correct.html, который мог бы помогает с точки зрения алгоритма, я написал Реализация на C#, если ваш язык C#) .

Я согласен с Марком и скажу, что вам лучше иметь алгоритм, который принимает ввод с разделителями, то есть this_is_a_test и преобразует его. Это было бы просто реализовать, то есть в псевдокоде: -

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)]

Вы также можете заменить мою функцию capitaliseFirstLetter () подходящим алгоритмом case, если хотите.

Реализация описанного выше алгоритма на C# выглядит следующим образом (полная консольная программа с тестовой оснасткой): -

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);
  }
}

Другие вопросы по теме