C#: finding instances of a string within a string

前端 未结 5 1414
心在旅途
心在旅途 2021-01-28 01:28

Suppose I had the string \"1 AND 2 AND 3 OR 4\", and want to create an array of strings that contains all substrings \"AND\" or \"OR\", in order, found within the string.

<
相关标签:
5条回答
  • 2021-01-28 01:30
    string rule = "1 AND 2 AND 3 OR 4";
    string pattern = "(AND|OR)";
    MatchCollection conditions = Regex.Matches(rule, pattern);
    

    Use Match.Value to get the string.

    0 讨论(0)
  • 2021-01-28 01:51

    Here's a goofy way that I came up with:

    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;
    
    0 讨论(0)
  • 2021-01-28 01:55

    This regex (.NET) seems to do what you want. You're looking for the matches (multiple) in the group at index=1:

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

    EDIT I've tested the following and it seems to do what you want. It's more lines than i would like but it approaches the task in a purely regex fashion (which IMHO is what you should be doing):

            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));
    
    0 讨论(0)
  • 2021-01-28 01:57

    Your probably looking for a tokeniser or Lexer, have a look at the following article:

    C# Regular Expression Recipes—A Better Tokenizer

    0 讨论(0)
  • 2021-01-28 01:57

    Since you know the exact substring you're looking for... why not just use IndexOf(substr, iOffset) to know the number of occurances (loop till it returns -1) ??

    Depending on the complexity of your task, it could be simpler/faster than using regular expressions (since you're not matching patterns).

    0 讨论(0)
提交回复
热议问题