문제

나는 문자열 정규화를 해야하는 코드를 작성하고 있습니다. 주어진 문자열을 낙타 사정 표현으로 바꾸고 싶습니다 (적어도 가장 좋은 추측으로). 예시:

"the quick brown fox" => "TheQuickBrownFox"
"the_quick_brown_fox" => "TheQuickBrownFox"
"123The_quIck bROWN FOX" => "TheQuickBrownFox"
"the_quick brown fox 123" => "TheQuickBrownFox123"
"thequickbrownfox" => "Thequickbrownfox"

나는 당신이 그 예에서 아이디어를 얻을 수 있어야한다고 생각합니다. 나는 모든 것을 벗겨 내고 싶다 특별한 문자 ( ', ",!, @,. 등), 모든 단어 (단어는 공간, _ 또는 -) 및 주요 숫자 삭제 (후행/ 내부는 괜찮지만이 요구 사항은 실제로 어려움에 따라 중요하지 않습니다).

나는 이것을 달성하는 가장 좋은 방법을 해결하려고 노력하고 있습니다. 나의 첫 번째 추측은 정규 표현이 될 것이지만, 내 성취 기술은 기껏해야 나쁘기 때문에 실제로 어디서부터 시작 해야할지 알지 못할 것입니다.

내 다른 아이디어는 데이터를 반복하고 구문 분석하는 것입니다. 단어, 각각을 구문 분석하고 문자열을 그런 식으로 재건했습니다.

아니면 내가 갈 수있는 다른 방법이 있습니까?

도움이 되었습니까?

해결책

간단한 솔루션을 사용하는 것은 어떻습니까? strings.stronv Microsoft.visualBasic 네임 스페이스에서? (Microsoft.visualBasic에 대한 프로젝트 참조를 추가하는 것을 잊지 마십시오) :

using System;
using VB = Microsoft.VisualBasic;


namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(VB.Strings.StrConv("QUICK BROWN", VB.VbStrConv.ProperCase, 0));
            Console.ReadLine();
        }
    }
}

다른 팁

이 REGEX는 모든 단어와 일치합니다. 그럼 우리 Aggregate 그것들은 첫 번째 숯을 대문자로하는 방법으로 ToLower줄의 나머지 부분.

Regex regex = new Regex(@"[a-zA-Z]*", RegexOptions.Compiled);

private string CamelCase(string str)
{
    return regex.Matches(str).OfType<Match>().Aggregate("", (s, match) => s + CamelWord(match.Value));
}

private string CamelWord(string word)
{
    if (string.IsNullOrEmpty(word))
        return "";

    return char.ToUpper(word[0]) + word.Substring(1).ToLower();
}

이 방법은 숫자를 무시합니다. 추가하려면 Regex를 @"[a-zA-Z]*|[0-9]*", 나는 생각합니다 - 그러나 나는 그것을 테스트하지 않았습니다.

특정 문자와 일치하는 솔루션은 일부 문자 인코딩과 잘 작동하지 않을 수 있습니다. 특히 수십 개의 공간 문자, 수천 개의 '기호', 수천 개의 구두점 문자, 수천 개의 '문자'등이있는 유니 코드 표현이 사용되는 경우. 내장 유니 코드 인식 기능을 사용할 수있는 곳이 더 좋습니다. '특별한 캐릭터'가 무엇인지에 따라, 당신은 유니 코드 카테고리. 예를 들어 '구두점'이 포함되지만 '기호'가 포함됩니까?

Tolower (), isletter () 등은 괜찮으나 유니 코드의 가능한 모든 문자를 고려해야합니다. 대시와 슬래시와 일치하는 것은 아마도 수십 개의 공간과 유니 코드의 대시 문자를 고려해야합니다.

당신은 할 수 있습니다 루비 슬리퍼를 착용하여 작동합니다 :)

def camelize str
  str.gsub(/^[^a-zA-z]*/, '').split(/[^a-zA-Z0-9]/).map(&:capitalize).join
end

시도하는 것이 재미있을 것이라고 생각했습니다. 여기에 내가 생각해 낸 것입니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            StringBuilder sb = new StringBuilder();
            string sentence = "123The_quIck bROWN FOX1234";

            sentence = sentence.ToLower();

            char[] s = sentence.ToCharArray();

            bool atStart = true;
            char pChar = ' ';

            char[] spaces = { ' ', '_', '-' };
            char a;
            foreach (char c in s)
            {
                if (atStart && char.IsDigit(c)) continue;

                if (char.IsLetter(c))
                {
                    a = c;
                    if (spaces.Contains(pChar))
                        a = char.ToUpper(a);
                    sb.Append(a);
                    atStart = false;
                }
                else if(char.IsDigit(c))
                {
                    sb.Append(c);
                }
                pChar = c;
            }

            Console.WriteLine(sb.ToString());
            Console.ReadLine();
        }
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top