문제

간단한 문자열 입력 구문 분석을 수행 중인데 문자열 토크나이저가 필요합니다.저는 C#을 처음 접했지만 Java를 프로그래밍한 적이 있으므로 C#에 문자열 토크나이저가 있어야 하는 것이 당연해 보입니다.그렇습니까?어디입니까?어떻게 사용하나요?

도움이 되었습니까?

해결책

당신은 사용할 수 있습니다 String.Split 메서드.

class ExampleClass
{
    public ExampleClass()
    {
        string exampleString = "there is a cat";
        // Split string on spaces. This will separate all the words in a string
        string[] words = exampleString.Split(' ');
        foreach (string word in words)
        {
            Console.WriteLine(word);
            // there
            // is
            // a
            // cat
        }
    }
}

자세한 내용은 다음을 참조하세요. C#에서 문자열 분할에 관한 Sam Allen의 기사 (성능, 정규식)

다른 팁

저는 C#의 Split 메서드의 강력한 기능을 강조하고 특히 Java 배경에서 온 누군가의 자세한 비교를 제공하고 싶습니다.

Java의 StringTokenizer는 단일 구분 기호만 허용하지만 실제로 여러 구분 기호로 분할하여 정규 표현식의 필요성을 줄일 수 있습니다(정규 표현식이 필요한 경우 반드시 정규 표현식을 사용하세요!). 예를 들면 다음과 같습니다.

str.Split(new char[] { ' ', '.', '?' })

이는 토큰 배열을 반환하는 세 개의 서로 다른 구분 기호로 나뉩니다.위 예제의 두 번째 매개변수를 사용하여 빈 배열을 제거할 수도 있습니다.

str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries)

Java의 String tokenizer에는 C#에는 부족하다고 생각되는 기능(적어도 Java 7에는 이 기능이 있음)이 구분 기호를 토큰으로 유지하는 기능이 있습니다.C#의 Split은 토큰을 삭제합니다.이는 일부 NLP 애플리케이션에서는 중요할 수 있지만 보다 일반적인 목적의 애플리케이션에서는 문제가 되지 않을 수 있습니다.

문자열의 분할 방법이 필요합니다.실제로 Java의 토크나이저 클래스는 Java의 문자열 분할 방법을 선호하여 더 이상 사용되지 않습니다.

.NET Framework에서 가장 가까운 것은 다음과 같습니다.

string.Split()

복잡한 분할의 경우 일치 컬렉션을 생성하는 정규식을 사용할 수 있습니다.

_words = new List<string>(YourText.ToLower().Trim('\n', '\r').Split(' ').
            Select(x => new string(x.Where(Char.IsLetter).ToArray()))); 

또는

_words = new List<string>(YourText.Trim('\n', '\r').Split(' ').
            Select(x => new string(x.Where(Char.IsLetterOrDigit).ToArray()))); 

사용 Regex.Split(string,"#|#");

이것을 읽어 보세요. 분할 함수에는 구분 기호로 구성된 배열이 있는 과부하가 있습니다.http://msdn.microsoft.com/en-us/library/system.stringsplitoptions.aspx

Java의 방법과 유사한 것은 다음과 같습니다.

Regex.Split(string, pattern);

어디

  • string - 분할해야 할 텍스트
  • pattern - 문자열 유형 패턴, 텍스트를 분할하는 것은 무엇입니까?

.NET 콘솔 앱에서 명령줄 인수 분할과 같은 작업을 시도하는 경우 .NET이 손상되었거나 영리하려고 하기 때문에 문제가 발생하게 됩니다(즉, 손상된 것만큼이나 좋음).인수를 공백 문자로 분할하고 인용된 모든 리터럴을 보존하여 중간에 분할되지 않도록 할 수 있어야 했습니다.이 작업을 수행하기 위해 작성한 코드는 다음과 같습니다.

private static List<String> Tokenise(string value, char seperator)
{
    List<string> result = new List<string>();
    value = value.Replace("  ", " ").Replace("  ", " ").Trim();
    StringBuilder sb = new StringBuilder();
    bool insideQuote = false;
    foreach(char c in value.ToCharArray())
    {
        if(c == '"')
        {
            insideQuote = !insideQuote;
        }
        if((c == seperator) && !insideQuote)
        {
            if (sb.ToString().Trim().Length > 0)
            {
                result.Add(sb.ToString().Trim());
                sb.Clear();
            }
        }
        else
        {
            sb.Append(c);
        }
    }
    if (sb.ToString().Trim().Length > 0)
    {
        result.Add(sb.ToString().Trim());
    }

    return result;
}

C# 3.5를 사용하는 경우 필요한 분할을 수행하는 System.String에 확장 메서드를 작성할 수 있습니다.그런 다음 다음 구문을 사용할 수 있습니다.

string.SplitByMyTokens();

MS의 추가 정보와 유용한 예는 여기를 참조하세요. http://msdn.microsoft.com/en-us/library/bb383977.aspx

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top