怎么判断一个字符串是否全部由某些特定的元素组成,并且将字符串分割成这些元素?
比如,我想判断一个字符串是否全部由a或者bc或者def组成,我这样写:
public string[] Split(string str)
{
Regex reg = new Regex(@"^((a)|(bc)|(def))+?$");
MatchCollection mc = reg.Matches(str);
if (mc.Count == 0)
return null;
else
return mc.Cast<Match>().Select(m => m.Value).ToArray();
}
但是,测试结果
string str = "abcadefbc";
Split(str);
返回了整个字符串。
而如果正则表达式中去掉^和$,就可以返回5个对应的元素,但是这样又不能判断“全部”的条件,在str中间插一个其他字符仍能返回5个元素。
请问该怎么解决?

解决方案 »

  1.   

    return mc[0].Groups[1].Captures.Cast<Capture>().Select(c => c.Value).ToArray();
      

  2.   


    好像不行啊。
    我改成这样:
    return mc[0].Groups.Cast<Group>().Where(g => g.Index > 0).Select(g => g.Value).ToArray();
    但不知道为什么返回bc,a,bc,def。少了一个,而且顺序也不对。
      

  3.   

      public string[] Split(string str)
                {
                    Regex reg = new Regex(@"^((a)|(bc)|(def))+?$");
                    if (reg.IsMatch(str))
                    {
                        string pattern = @"(?i)(a)+|(bc)+|(def)+";
                        return Regex.Matches(str,pattern).Cast<Match>().Select(a=>a.Value).ToArray();
                    }
                    else
                        return null;
                }
      

  4.   

        public IEnumerable<string> Split(string str)
        {
          var matches=  System.Text.RegularExpressions.Regex.Matches(str, @"((a)|(bc)|(def))+?");
          foreach (System.Text.RegularExpressions.Match m in matches)
          {
              yield return m.Groups[1].Value;
          }
        }
      

  5.   

     public string[] Split(string str)
        {
            System.Collections.Generic.List<string> source = new List<string>();
            foreach (Match m in Regex.Matches(str, @"((a)|(bc)|(def))"))
            {
                source.Add(m.Value.Trim());
            }
            if (string.Join("", source.ToArray()).Length != str.Length)
            {
                return null;
            }
            else
            {
                return source.ToArray();
            }
        }