문제
문자열 "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를 찾고있을 것입니다. 다음 기사를 살펴보십시오.
당신이 찾고있는 정확한 부분 문자열을 알고 있기 때문에 ... 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;
제휴하지 않습니다 StackOverflow