正则表达式的问题, 非常有难度

petshop4 2010-10-28 03:52:58
字符串: 0000001000001100111000000
位数的5的整倍数, 要求, 每隔5位为一组,
例如上面的字符串分组如下:
组1:00000
组2:01000
组3:00110
组4:00000
组5:01110
组6:00000

要求: 去掉在前面 只有一个1, 或者没有1, 的连续组, 去掉后面只有一个1, 或者没有1的连续组

得到字符串001100000001110
也就是 得到3,4,5组
...全文
258 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
q107770540 2010-10-29
  • 打赏
  • 举报
回复
非正则的做法你可参考12楼的代码

将中间部分取出 ,其他部分的截取我已写好
xianzhi558 2010-10-28
  • 打赏
  • 举报
回复
0 0 看的我有点晕 用正则有点太牵强了吧。。。。。。
petshop4 2010-10-28
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 wuyazhe 的回复:]

或是优化一下

C# code
^(?:0{4}[01]|10{4}|010{3})*((?:[0-1]{5})*?)(?:0{4}[01]|10{4}|010{3})*$

分组1.
[/Quote]
这样是可以的, 实际上远远不止5位一组(代码是用来逐行扫描图片的, 除非图片的宽度是5。....). 结贴, 我用非正则做好了. 看来正则真无解
兔子-顾问 2010-10-28
  • 打赏
  • 举报
回复
或是优化一下

^(?:0{4}[01]|10{4}|010{3})*((?:[0-1]{5})*?)(?:0{4}[01]|10{4}|010{3})*$

分组1.
兔子-顾问 2010-10-28
  • 打赏
  • 举报
回复
忘写了。获取分组1
兔子-顾问 2010-10-28
  • 打赏
  • 举报
回复
那这样试试


^(?:0{5}|0{4}1|10{4}|010{3})*((?:[0-1]{5})*?)(?:0{5}|0{4}1|10{4}|010{3})*$
zsc970 2010-10-28
  • 打赏
  • 举报
回复
你不用管它有多在吧,用while循环,每次剪5位出来判断,到满足为止就是了
petshop4 2010-10-28
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 wuyazhe 的回复:]

看不懂你的规则了。你顶楼要的不就是
010000011001110

你Trim掉头尾连续的5个1或5个0?
01000怎么又不要了?

不明白你的意思了。
[/Quote]
不是连续的5个1, 而是1个1,
也就是说5位全部为0, 或者有一个1, 视作空格. 然后string.trim();
兔子-顾问 2010-10-28
  • 打赏
  • 举报
回复
看不懂你的规则了。你顶楼要的不就是
010000011001110

你Trim掉头尾连续的5个1或5个0?
01000怎么又不要了?

不明白你的意思了。
petshop4 2010-10-28
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 zsc970 的回复:]

一定要正则吗,用字符串处理不成?
[/Quote]
(图片识别程序)实际字符串很大, 例子里的5位一组只是举例.
petshop4 2010-10-28
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 wuyazhe 的回复:]

引用 15 楼 petshop4 的回复:
猫猫, 感谢你的非正则答案, 但我要的是正则.
问题不算难, 但只用正则, 很难!

10楼贴给你的不行?
[/Quote]
不行!
看:
测试字符:0000001000001100111000000
正则:^(?:([01])\1{4})*((?:[0-1]{5})*?)(?:([01])\3{4})*?$
结果:

捕获数量: 1
********捕获: 1****gourp_count:4********
************ gourp[0]*********
0000001000001100111000000
************ gourp[1]*********
0
************ gourp[2]*********
010000011001110
************ gourp[3]*********
0
==============
很明显, gourp[2]里面 01000 不是我要的
zsc970 2010-10-28
  • 打赏
  • 举报
回复
一定要正则吗,用字符串处理不成?
兔子-顾问 2010-10-28
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 petshop4 的回复:]
猫猫, 感谢你的非正则答案, 但我要的是正则.
问题不算难, 但只用正则, 很难!
[/Quote]
10楼贴给你的不行?
petshop4 2010-10-28
  • 打赏
  • 举报
回复
猫猫, 感谢你的非正则答案, 但我要的是正则.
问题不算难, 但只用正则, 很难!
petshop4 2010-10-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 q107770540 的回复:]

“前面” “后面” 指什么?

组4为何入选?
[/Quote]

因为组4在中间 .

其实问题有点类似于string.trim()方法, 每一个分组, 如果只有一个1,或者没有1, 就当空格处理. 组4虽然没有1, 是空格. 可是不是在"前面"和"后面".
这样说 ,明白了吗?
q107770540 2010-10-28
  • 打赏
  • 举报
回复

string s="000000100000110000000111000000";

for(int i=0;i<s.Length /5;i++)
{
var t =s.ToCharArray().Skip(i*5).Take(5).ToArray();
if(t.Count(n=>n=='1')>1)
{
Console.WriteLine(new string(t));
}
}

q107770540 2010-10-28
  • 打赏
  • 举报
回复

void Main()
{
string s="000000100000110000000111000000";

for(int i=0;i<s.Length /5;i++)
{
string t =new string(s.ToCharArray().Skip(i*5).Take(5).ToArray());
if(t.ToCharArray().Count(n=>n=='1')>1)
{
Console.WriteLine(t);
}
}


}

/*
00110
01110
*/

//此代码得到的结果是 : 每组中1的个数大于1的数组
兔子-顾问 2010-10-28
  • 打赏
  • 举报
回复
^(?:([01])\1{4})*((?:[0-1]{5})*?)(?:([01])\3{4})*?$
获取分组2就是你要的。
q107770540 2010-10-28
  • 打赏
  • 举报
回复
“前面” “后面” 指什么?

组4为何入选?
petshop4 2010-10-28
  • 打赏
  • 举报
回复
我现在 要把只有一个1的分组也去掉. 原正则只能去掉没有1的.
加载更多回复(7)

62,271

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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