[c#] 따옴표로 묶지 않은 공백을 구분하는 정규 표현식


Answers

Lieven의 솔루션은 그곳에있는 대부분의 방법을 얻었으며 그의 의견에 Bartek의 솔루션으로 결말을 바꾸는 문제 일뿐입니다. 최종 결과는 다음과 같이 작동합니다.

(?<=")\w[\w\s]*(?=")|\w+|"[\w\s]*"

입력 : 여기에 "내 문자열"은 "6 개의 일치"가 있습니다.

산출:

  1. 이리
  2. ~이다.
  3. "내 끈"
  4. 그것
  5. 있다
  6. "6 경기"

불행히도 따옴표가 포함되어 있습니다. 대신 다음을 사용하는 경우

(("((?<token>.*?)(?<!\\)")|(?<token>[\w]+))(\s)*)

다음과 같이 "토큰"일치 항목을 명시 적으로 캡처합니다.

    RegexOptions options = RegexOptions.None;
    Regex regex = new Regex( @"((""((?<token>.*?)(?<!\\)"")|(?<token>[\w]+))(\s)*)", options );
    string input = @"   Here is ""my string"" it has   "" six  matches""   ";
    var result = (from Match m in regex.Matches( input ) 
                  where m.Groups[ "token" ].Success
                  select m.Groups[ "token" ].Value).ToList();

    for ( int i = 0; i < result.Count(); i++ )
    {
        Debug.WriteLine( string.Format( "Token[{0}]: '{1}'", i, result[ i ] ) );
    }

디버그 출력 :

Token[0]: 'Here'
Token[1]: 'is'
Token[2]: 'my string'
Token[3]: 'it'
Token[4]: 'has'
Token[5]: ' six  matches'
Question

.Net Regex.Split 메서드를 사용하여이 입력 문자열을 배열로 분할하고 싶습니다. 따옴표로 묶이지 않으면 공백으로 분리해야합니다.

입력 : 여기에 "내 문자열"은 "6 개의 일치"가 있습니다.

예상 출력 :

  1. 이리
  2. ~이다.
  3. 내 끈
  4. 그것
  5. 있다
  6. 6 경기

어떤 패턴이 필요합니까? 또한 RegexOptions를 지정해야합니까?




최고 대답은 나를 위해 아주 효과적이지 않습니다. 나는이 종류의 문자열을 공백으로 나누려고했지만 점 ( '.')으로 나뉘는 것처럼 보입니다.

"the lib.lib" "another lib".lib

나는 정규식에 대해 묻는 질문을 알고 있지만,이 일을 정규식이 아닌 함수를 작성 결국 :

    /// <summary>
    /// Splits the string passed in by the delimiters passed in.
    /// Quoted sections are not split, and all tokens have whitespace
    /// trimmed from the start and end.
    public static List<string> split(string stringToSplit, params char[] delimiters)
    {
        List<string> results = new List<string>();

        bool inQuote = false;
        StringBuilder currentToken = new StringBuilder();
        for (int index = 0; index < stringToSplit.Length; ++index)
        {
            char currentCharacter = stringToSplit[index];
            if (currentCharacter == '"')
            {
                // When we see a ", we need to decide whether we are
                // at the start or send of a quoted section...
                inQuote = !inQuote;
            }
            else if (delimiters.Contains(currentCharacter) && inQuote == false)
            {
                // We've come to the end of a token, so we find the token,
                // trim it and add it to the collection of results...
                string result = currentToken.ToString().Trim();
                if (result != "") results.Add(result);

                // We start a new token...
                currentToken = new StringBuilder();
            }
            else
            {
                // We've got a 'normal' character, so we add it to
                // the curent token...
                currentToken.Append(currentCharacter);
            }
        }

        // We've come to the end of the string, so we add the last token...
        string lastResult = currentToken.ToString().Trim();
        if (lastResult != "") results.Add(lastResult);

        return results;
    }



이 정규식은 따옴표 나 여분의 공백을 제거하지 않지만 위에 주어진 경우를 기반으로 분할되므로 문자열에 대한 후 처리를 원할 수 있습니다. 이렇게하면 따옴표 붙은 문자열을 올바르게 유지해야합니다.

"[^"]+"|\s?\w+?\s



코드 프로젝트에서 LSteinle의 " 텍스트 한정자를 지원하는 분할 함수 "살펴보기

관심이있는 그의 프로젝트에서 발췌 한 내용입니다.

using System.Text.RegularExpressions;

public string[] Split(string expression, string delimiter, string qualifier, bool ignoreCase)
{
    string _Statement = String.Format("{0}(?=(?:[^{1}]*{1}[^{1}]*{1})*(?![^{1}]*{1}))", 
                        Regex.Escape(delimiter), Regex.Escape(qualifier));

    RegexOptions _Options = RegexOptions.Compiled | RegexOptions.Multiline;
    if (ignoreCase) _Options = _Options | RegexOptions.IgnoreCase;

    Regex _Expression = New Regex(_Statement, _Options);
    return _Expression.Split(expression);
}

호출 할 때마다 Regex 문을 컴파일하고 컴파일하는 루프를 호출하는 것에주의하십시오. 그래서 좀 더 많은 시간을 필요로한다면 Regex 캐시를 만들 것입니다.




숀,

다음 정규 표현식을 사용해야한다고 생각합니다.

(?<=")\w[\w\s]*(?=")|\w+  

문안 인사,
Lieven




Related



Tags

c# c#   .net .net   regex