例子(1):456系统2223asdf345g
例子(2):df3452asdfgsdf字符串如果有‘系统’字段,则提取之后第一次遇到的3个数字字符 ,比如(1)中 222
如果没有‘系统’,直接提取第一次遇到的3个数字字符,(2)中的 345这个正则表达式怎么写?

解决方案 »

  1.   

    "\\D*[\\u7cfb\\u7edf]?(\\d{3})\\S*"import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class Regular { public static void main(String[] args) {
    String s = "";
    String s1 = "456系统2223asdf345g";
    String s2 = "df3452asdfgsdf";
    Pattern p = Pattern.compile("\\D*[\\u7cfb\\u7edf]?(\\d{3})\\S*");
    Matcher m1 = p.matcher(s1);
    Matcher m2 = p.matcher(s2);
    while(m1.find() | m2.find()) {
    System.out.println("result1=" + m1.group(1) + "\nresult2=" + m2.group(1));
    }
    }
    }
    result1=456
    result2=345
      

  2.   

    要睡觉了,没怎么仔细考虑,写得可能有些繁琐string[] test = new string[] { "456系统2223asdf345g", "df3452asdfgsdf" };
    Regex reg = new Regex(@"(?<=系统)\d{3}|(?<=^(?:(?!系统|\d{3,}).)*)\d{3}(?!.*?系统)");
    foreach (string s in test)
    {
        richTextBox2.Text += "源字符串:" + s + "     匹配结果:" + reg.Match(s).Value + "\n";
    }
    /*---------输出---------
    源字符串:456系统2223asdf345g     匹配结果:222
    源字符串:df3452asdfgsdf     匹配结果:345
    */还有种情况没处理,就是如果有“系统”,但是“系统”后不是连续的三个数字,有没有这种情况出现
      

  3.   

                string html = @"456系统2223asdf345g";
                Regex reg = new Regex(@"(?<=(系统|[^0-9]))\d{3}");
                MatchCollection mc = reg.Matches(html);
                Console.WriteLine("/*\n------输出结果------------");
                foreach (Match m in mc)
                {
                    Console.WriteLine(m.Groups[0].ToString());
                }
      

  4.   

    改了一下,应该都能满足要求,但也都同样的让人不爽string[] test = new string[] { "456系统2223asdf345g", "df3452asdfgsdf", "456系统abc2223asdf345g", "df3452asd系统fgsdf" };
    Regex reg = new Regex(@"(?<=系统.*?)\d{3}|(?<=^(?:(?!系统|\d{3}).)*)\d{3}(?!.*?系统.*?\d{3})");
    foreach (string s in test)
    {
        richTextBox2.Text += "源字符串:" + s + "     匹配结果:" + reg.Match(s).Value + "\n";
    }
    /*---------输出---------
    源字符串:456系统2223asdf345g     匹配结果:222
    源字符串:df3452asdfgsdf     匹配结果:345
    源字符串:456系统abc2223asdf345g     匹配结果:222
    源字符串:df3452asd系统fgsdf     匹配结果:345
    */string[] test = new string[] { "456系统2223asdf345g", "df3452asdfgsdf", "456系统abc2223asdf345g", "df3452asd系统fgsdf" };
    Regex reg = new Regex(@"(?<=(系统).*?|^(?:(?!系统).)*)\d{3}(?(1)|(?!.*?系统.*?\d{3}))");
    foreach (string s in test)
    {
        richTextBox2.Text += "源字符串:" + s + "     匹配结果:" + reg.Match(s).Value + "\n";
    }
    /*---------输出---------
    源字符串:456系统2223asdf345g     匹配结果:222
    源字符串:df3452asdfgsdf     匹配结果:345
    源字符串:456系统abc2223asdf345g     匹配结果:222
    源字符串:df3452asd系统fgsdf     匹配结果:345
    */
      

  5.   

    sorry 在沙发失误了。这个经测试完全达到要求了。是java的代码,你自己转成c#的吧。 String s1 = "456系统2223asdf345g";
    String s2 = "df3452asdfgsdf888d333";
    Pattern p1 = Pattern.compile("[\\S&&\\D]*(\\d{3})\\S*?(\\u7cfb\\u7edf(\\d{3}))?\\S*");
    Matcher m1 = p1.matcher(s1);
    Matcher m2 = p1.matcher(s2);
    while(m1.find() | m2.find()) {
    if(m1.group(2) != null) {
    System.out.println("result1=" + m1.group(3));
    } else {
    System.out.println("result1=" + m1.group(1));
    }
    System.out.println("result2=" + m2.group(1));
    }
    }
    result1=222
    result2=345
      

  6.   


    /*
    惭愧啊。今儿我刚注册CSDN。这是我回的第一封帖。居然犯了那么多的错误,不可原谅啊!
    明天我就要去面试了,但还是那么菜!还好最后终于抠出来了,天也快亮了。
    佩服楼上的过客兄,让我豁然开朗。我俩的方法不同,但你的跟简洁。楼主可放心用了,呵呵~
    希望各位牛大哥多帮帮菜小弟我。编程是很快乐的事,努力!明天会更好!*/
    string[] strs = new string[] { "456系统2223asdf345g", "df3452asdfgsdf", 
                "456系统xx2223asdf345g", "df3452asd系统fgsdf" };Regex reg = new Regex(@"[\S&&\D]*(\d{3})\S*?(\u7cfb\u7edf)?\S*?(\d{3})?");
    MatchCollection mc = reg.Matches(strs);
    foreach (Match m in mc)
    {
        if(m.Groups[2] != null && m.Groups[3] != null) {
        Console.WriteLine("result={0}" + m.Groups[3].ToString());
        } else {
            Console.WriteLine("result={0}" + m.Groups[1].ToString());
        }
    }
    /*
    result=222
    result=345
    result=222
    result=345
    */
      

  7.   

    过客兄的 df3452asd系统fgsdf     应该返回空 因为有“系统”而系统后没有连续三个数字另外为什么不用正则的if-else呢?            string[] test = new string[] { "456系统2223asdf345g", "df3452asdfg888sdf", "456系统abc2223asdf345g", "df3452asd系统fgsdf" };
                Regex reg = new Regex(@"(?<=(?(?=.*?系统).*?系统)\D*)[0-9]{3}");
                foreach (string s in test)
                {
                    Console.WriteLine("源字符串:" + s + "     匹配结果:" + reg.Match(s).Value + "\n");
                }
    /*---------输出---------
    源字符串:456系统2223asdf345g     匹配结果:222
    源字符串:df3452asdfg888sdf    匹配结果:345
    源字符串:456系统abc2223asdf345g     匹配结果:222
    源字符串:df3452asd系统fgsdf     匹配结果:
    */
      

  8.   


    (?=^[^系统]*$).*?(?<num>\d{3})|.*?系统.*?(?<num>\d{3})
    取组为num的值
      

  9.   


    嗯,这是个需求明确的问题,我在2楼已经提了,楼主还没有给出回复if-else结构我在4楼第二个正则中用了,但还是由于需求的问题,如何写还需要根据需求来定
      

  10.   

    感谢楼上各位的回复。
    不好意思,我没有说得很清楚。
    我的目的是对excel文件的其中一列的各项进行筛选,筛选结果写到另一列
    筛选的条件有几个
    比如含有AAA字符的优先把AAA写到另一列对应位置;
    含有BBB的把BBB写到另一列
    其中有一类是含有3位数字的,就是我前面说的情况,如果没有3位连续数字就判断其他条件。我的原意是像mbh0210兄写得那样
    但是我试了 (?=^[^系统]*$).*?(?<num>\d{3})|.*?系统.*?(?<num>\d{3})
    只能提取没有‘系统’字段的3位数字刚接触正则表达式,向各位学习
      

  11.   

    lxcnn兄写的可以,处理了1000多条,没问题
      

  12.   

    如果是这样,那就简单多了,看看是否满足你的要求吧,如果不满足,给出实例string[] test = new string[] { "456系统2223asdf345g", "df3452asdfgsdf", "456系统abc2223asdf345g", "df3452asd系统fgsdf" };
    Regex reg = new Regex(@"\d{3}(?!.*?系统)|(?<=系统.*?)\d{3}");
    foreach (string s in test)
    {
        richTextBox2.Text += "源字符串:" + s + "     匹配结果:" + reg.Match(s).Value + "\n";
    }
    /*---------输出---------
    源字符串:456系统2223asdf345g     匹配结果:222
    源字符串:df3452asdfgsdf     匹配结果:345
    源字符串:456系统abc2223asdf345g     匹配结果:222
    源字符串:df3452asd系统fgsdf     匹配结果:
    */
      

  13.   


    呵呵,我现在有些糊涂了
    df3452asd系统fgsdf 
    这个倒底要不要取得数字呢不过不管哪种情况吧,要取得就4楼的,不要取得就14楼的