当前位置:编程学习 > C#/ASP.NET >>

能解者是高手。。。

用正则,我想匹配 5位数字里,有两个8的一组
如:87837,12345,45678,
取:87837(只两个8)
只两个是8的,5位数。。 --------------------编程问答--------------------

 string numstr = "87837,12345,45678,68844";
            MatchCollection mc = Regex.Matches(numstr, @"\d{5}");
            foreach (Match mcnum in mc)
            {
                string num = mcnum.Value;
                if (num.ToCharArray().Where(x => x.ToString() == "8").Count() == 2)
                {
                    Console.WriteLine(mcnum.Value);
                }
            }
--------------------编程问答-------------------- 我现在的需求,要求我只能有一句正则来实现,所以。。。但还是谢谢你。 --------------------编程问答-------------------- 判断5个数字直接判断字符串长度,判断2个8用这个正则“\d*8\d*8\d*”,这两个必须分开判断。 --------------------编程问答--------------------
 string str = "87837,12345,45678";
            var result = Regex.Matches(str, @"(?(\d{5}(?=,|$))\d*?(8)[^\1]*?\1[^\1,]*)").OfType<Match>().Where(a=>!string.IsNullOrEmpty(a.Value)).Select(a=>a.Value);
--------------------编程问答--------------------
引用 2 楼 alisdk 的回复:
我现在的需求,要求我只能有一句正则来实现,所以。。。但还是谢谢你。

因为8位置不固定,你这种需求一句正则有点难度 --------------------编程问答-------------------- (?(\d{5}(?=,|$))\d*?8[^,8]*?8[^8,]*) --------------------编程问答--------------------
引用 6 楼 Chinajiyong 的回复:
(?(\d{5}(?=,|$))\d*?8[^,8]*?8[^8,]*)

借鉴了4L的写法,他那个好像有点问题, --------------------编程问答-------------------- 这题有点难太费神还是期待高手吧 --------------------编程问答--------------------
引用 7 楼 Chinajiyong 的回复:
Quote: 引用 6 楼 Chinajiyong 的回复:

(?(\d{5}(?=,|$))\d*?8[^,8]*?8[^8,]*)

借鉴了4L的写法,他那个好像有点问题,


求版主讲解此表达式 --------------------编程问答-------------------- --------------------编程问答-------------------- 排除法:

^(?!([0-7]|9)+$)^(?!8+$)(?!([0-7]|9)*8([0-7]|9)*$)(?!([0-7]|9)*8([0-7]|9)*8([0-7]|9)*8([0-7]|9)*$)(?!([0-7]|9)*8([0-7]|9)*8([0-7]|9)*8([0-7]|9)*8([0-7]|9)*$)\d{5}$ --------------------编程问答--------------------
void Main()
{
int[] ary=new int[]{87837,12345,45678,112481824};
Regex reg=new Regex(@"^(?!([0-7]|9)+$)^(?!8+$)(?!([0-7]|9)*8([0-7]|9)*$)(?!([0-7]|9)*8([0-7]|9)*8([0-7]|9)*8([0-7]|9)*$)(?!([0-7]|9)*8([0-7]|9)*8([0-7]|9)*8([0-7]|9)*8([0-7]|9)*$)\d{5}$");
foreach(int i in ary)
Console.WriteLine("{0} --- {1}",i,reg.IsMatch(i.ToString()));
/*
87837 --- True
12345 --- False
45678 --- False
112481824 --- False
*/
}
--------------------编程问答-------------------- 简化一下:

^(?!([0-7]|9)+$)^(?!8+$)(?!([0-7]|9)*8([0-7]|9)*$)(?!(([0-7]|9)*8){3}([0-7]|9)*$)(?!(([0-7]|9)*8){4}([0-7]|9)*$)\d{5}$ --------------------编程问答-------------------- 都是牛人啊~~~~我只是来打酱油的 --------------------编程问答-------------------- 期待 过客 更优的正则解法 --------------------编程问答--------------------
void Main()
{
 string str="87837,12345,45678,114818";
 Regex reg=new Regex(@"^(?!([0-7]|9)+$)^(?!8+$)(?!([0-7]|9)*8([0-7]|9)*$)(?!(([0-7]|9)*8){3}([0-7]|9)*$)(?!(([0-7]|9)*8){4}([0-7]|9)*$)\d{5}$");
 foreach(string s in str.Split(','))
Console.WriteLine("{0} --- {1}",s,reg.IsMatch(s));
}
--------------------编程问答-------------------- 路过,来看看正则。。。。 --------------------编程问答-------------------- 正則就是用來處理這些事的麼? --------------------编程问答-------------------- 刚学到正则 来看看学习下 --------------------编程问答-------------------- ^(?!([0-7]|9)+$)^(?!8+$)(?!([0-7]|9)*8([0-7]|9)*$)(?!(([0-7]|9)*8){3}([0-7]|9)*$)(?!(([0-7]|9)*8){4}([0-7]|9)*$)\d{5}$


红色部分不需要


--------------------编程问答-------------------- 正则太费脑子了。小菜鸟路过。 --------------------编程问答-------------------- 我只是来看答案的 --------------------编程问答--------------------
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,