请教一个正则的问题

Cloveaf 2012-08-03 01:15:03
怎么判断一个字符串是否全部由某些特定的元素组成,并且将字符串分割成这些元素?
比如,我想判断一个字符串是否全部由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个元素。
请问该怎么解决?
...全文
267 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Cloveaf 2012-08-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
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.Valu……
[/Quote]

这倒也是个解决方案。但和用两个正则一样总感觉多做了一步。看看还有没有更好的办法。
  • 打赏
  • 举报
回复
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();
}
}
Cloveaf 2012-08-03
  • 打赏
  • 举报
回复
UP。有没有用一个正则就能解决的办法?
Cloveaf 2012-08-03
  • 打赏
  • 举报
回复
[Quote=引用 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 matche……
[/Quote]

不对,这样就判断不了“全部”了
Cloveaf 2012-08-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
C# code

public string[] Split(string str)
{
Regex reg = new Regex(@"^((a)|(bc)|(def))+?$");
if (reg.IsMatch(str))
{
……
[/Quote]

一个正则搞不定了么?
  • 打赏
  • 举报
回复
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;
}
}

  • 打赏
  • 举报
回复
  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;
}
Cloveaf 2012-08-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
return mc[0].Groups[1].Captures.Cast<Capture>().Select(c => c.Value).ToArray();
[/Quote]

好像不行啊。
我改成这样:
return mc[0].Groups.Cast<Group>().Where(g => g.Index > 0).Select(g => g.Value).ToArray();
但不知道为什么返回bc,a,bc,def。少了一个,而且顺序也不对。
x8bits 2012-08-03
  • 打赏
  • 举报
回复
return mc[0].Groups[1].Captures.Cast<Capture>().Select(c => c.Value).ToArray();

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧