문제

문자열 "1 및 2 및 3 또는 4"가 있다고 가정하고 문자열 내에서 발견 된 순서대로 모든 하위 문자열을 포함하는 문자열 배열을 만들고 싶다고 가정합니다.

따라서 위의 문자열은 { "및", ",", "또는"}의 문자열 배열을 반환합니다.

그 글을 쓰는 현명한 방법은 무엇입니까?

편집 : C# 2.0+ 사용

string rule = "1 AND 2 AND 3 OR 4";
string pattern = "(AND|OR)";
string[] conditions = Regex.Split(rule, pattern);

{ "1", ",", "2", "및", "3", "또는"4 "}를 제공합니다. 그것들을 어떻게 ands와 ors로만 줄일 수 있습니까?

도움이 되었습니까?

해결책

이 regex (.net)는 당신이 원하는 것을하는 것 같습니다. INDEX = 1에서 그룹의 경기 (다중)를 찾고 있습니다.

.*?((AND)|(OR))*.*?

편집하다 나는 다음을 테스트했고 당신이 원하는 것을하는 것 같습니다. 그것은 내가 원하는 것보다 더 많은 라인이지만 순수한 정규식 방식으로 작업에 접근합니다 (IMHO는 당신이해야 할 일입니다).

        string text = "1 AND 2 AND 3 OR 4";
        string pattern = @"AND|OR";

        Regex r = new Regex(pattern, RegexOptions.IgnoreCase);

        Match m = r.Match(text);
        ArrayList results = new ArrayList();
        while (m.Success)
        {
            results.Add(m.Groups[0].Value);

            m = m.NextMatch();
        }

        string[] matchesStringArray = (string[])results.ToArray(typeof(string));

다른 팁

아마도 토큰 자 또는 Lexer를 찾고있을 것입니다. 다음 기사를 살펴보십시오.

C# 정규식 레시피 - 더 나은 토큰 화기

당신이 찾고있는 정확한 부분 문자열을 알고 있기 때문에 ... indexof (substr, ioffset) 발생 횟수를 알기 위해 (-1을 반환 할 때까지 루프) ??

작업의 복잡성에 따라 정규 표현식을 사용하는 것보다 간단하고 빠를 수 있습니다 (패턴과 일치하지 않기 때문에).

string rule = "1 AND 2 AND 3 OR 4";
string pattern = "(AND|OR)";
MatchCollection conditions = Regex.Matches(rule, pattern);

매치를 사용하여 문자열을 얻으십시오.

내가 생각해 낸 구피 방법은 다음과 같습니다.

string rule = "1 AND 2 AND 3 OR 4";
List<string> andsOrs = new List<string>();
string[] split = rule.Split();
for (int i = 0; i < split.Length; i++)
{
   if (split[i] == "AND" || split[i] == "OR")
   {
       andsOrs.Add(split[i]);
   }
}
string[] conditions = andsOrs.ToArray();
return conditions;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top