前段时间我还以为我在正则领域成绝顶高手,天下没有我无法匹配的正则了,哪晓得一个小问题就难倒了我:
匹配不是abc的所有串。即可以匹配ab,abcd,abcabc,等等所有,除了连接的abc外。语义大概就是^[^(abc)]$,但这样是不行的,不知是不是就无解?

解决方案 »

  1.   

    string strReg=@"((?<!abc).(?!abc))";
      

  2.   

    少了个+号。。string strReg=@"((?<!abc).(?!abc))+";
      

  3.   

    ((?<!abc).(?!abc))+匹配abc返回true
      

  4.   

    Regex r = new Regex( @"^( *abc *|.* abc .*)$");
    if (!r.IsMatch(s))
    {
        Console.WriteLine("is not abc");
    }
    else
    {
        Console.WriteLine("is abc");
    }反其道而行,不知道楼主要的是不是这效果...
      

  5.   

    呵,先谢谢楼上捧场,不过我要的不是这种效果,因为我拿这个abc只是一个象征,还有很多其它场景用这种方法就不好做,比如:
    匹配以数字开头数字结尾,但中间不是all的内容。
    匹配:43alll3232,3al3,4b3
    但不匹配:3all3,4all89
      

  6.   

    不用IsMatch
    string strpatten = "\\dall\\d";
    string[] str =new string[4];
    str[0] ="43alll3232";
    str[1] = "3al3";
    str[2] = "4b3";
    str[3] = "3all3";
    System.Text.RegularExpressions.Regex regx = new Regex( strpatten );
    for( int i=0 ; i<4 ; i++ )
    {
    System.Text.RegularExpressions.MatchCollection match = regx.Matches( str[i]);
    Console.WriteLine( "{0}" , match.Count==0?"匹配":"不匹配" );
    }
      

  7.   

    to hdt(倦怠):
    首先谢谢你的参与!你的这种方法确实可以判断出3all8这种数字开头数字结尾的情况,但对于ealle这种不是数字开头数字结尾的情况我的题意是不匹配,而单从你上面的测试就会成为匹配。当然可以再加一层去处理。
    然而,如果再把题目加深一层,这种方法就失效了(不一定失效,只是我暂时没想到如何应用):我想替换一段文章中所有:一个数字开头一个数字结尾,但中间"不是all"的其它任意三位字母的数据,替换为%。3all72abc14qq4
    替换后为:3all7%4qq4
      

  8.   

    直接用replace就号了
    有必要这么麻烦么?
      

  9.   

    用()将abc分为一组(abc),在^[(abc)],不知可以吗?
      

  10.   

    jingtao_zhou(小熊) ( ) 信誉:100    Blog  2006-8-29 13:30:22  得分: 0  
     直接用replace就号了
    有必要这么麻烦么?
    ___________________________你是指怎么用?如果能解决这类问题,当然就行。我特别不想麻烦。
      

  11.   

    guolianghu(hgl) ( ) 信誉:81    Blog  2006-08-29 13:35:00  得分: 0  
     
     
    用()将abc分为一组(abc),在^[(abc)],不知可以吗?
    _______________________________________________________你是指的:[^(abc)]这样用吧?
    不行,这相当于匹配除了abc()这五个字符以外的任意字符。
      

  12.   

    using System;
    using System.Collections;
    using System.IO;
    using System.Text.RegularExpressions;
    public class MyClass
    {
     public static void Main()
    {
      string s="3all72abc14qq4";
      string tmp=System.Text.RegularExpressions.Regex.Replace(s,@"[\d]abc[\d]",new MatchEvaluator(str_replace));
      Console.WriteLine(s);
      Console.WriteLine(tmp);
      Console.ReadLine();
    }
    public static string str_replace(Match match)
    {
      if(match.Value!=null|match.Value!="")
      {
       return match.Value.Substring(0,1)+"%"+match.Value.Substring(match.Value.Length-1,1);
      }
       return match.Value;
    }

    }
      

  13.   

    我想替换一段文章中所有:一个数字开头一个数字结尾,但中间"不是all"的其它任意三位字母的数据,替换为%。3all72abc14qq4
    替换后为:3all7%4qq4
    按照你的意思
     string tmp=System.Text.RegularExpressions.Regex.Replace(s,@"[\d]abc[\d]",new MatchEvaluator(str_replace));
    应该改成
    string tmp=System.Text.RegularExpressions.Regex.Replace(s,@"[\d][a-zA-Z]{3}(?<!all)[\d]",new MatchEvaluator(str_replace));
      

  14.   

    to jingtao_zhou(小熊):你是正则高手,鉴定完毕。我要的就是这句:[\d][a-zA-Z]{3}(?<!all)[\d]谢谢。
      

  15.   

    而第一个题目中要的其实就是:^.*(?<!all)$但是为什么 ^(?!all).*$ 不行?在这里(?<!)和(?!)又有什么区别?
      

  16.   

    ?!
    零宽度负预测先行断言。仅当子表达式不在此位置的右侧匹配时才继续匹配。例如,\b(?!un)\w+\b 与不以 un 开头的单词匹配。
    ?<!
    零宽度负回顾后发断言。仅当子表达式不在此位置的左侧匹配时才继续匹配
      

  17.   

    ^(?!all).*$
    匹配是不以all开头的字符串吧
      

  18.   

    jingtao_zhou(小熊) ( ) 信誉:100    Blog  2006-08-29 14:36:00  得分: 0  
     
     
    ^(?!all).*$
    匹配是不以all开头的字符串吧
    _______________________________是匹配除all以外的任意字符,包括:al,alll,gfds等等。
      

  19.   

    echo "3all72abc14qq4" | sed 's/all/***/g' | sed 's/[a-z]\{3\}/%/g' | sed 's/\*\*\*/all/g'
      

  20.   

    我是说这个,呵呵:^.*(?<!all)$,这是我的目的。你说的那个确实成了不以all开头的字符串。
      

  21.   

    ^.*(?<!all)$仔细研究了一下,发现:^.*(?<!all)$也没达到我的目的,:^.*(?<!all)$只是匹配不以all结尾的任意值。
      

  22.   

    试试
    ^[\w]*?(?<!(all[\d]*))$
      

  23.   

    改一下
    ^[\w]*?(?<!((all)+[\d]*))$
      

  24.   

    哇哈哈哈!我终于我把题目上的问题解答了:
    (?<!^all$)$
    你可以试试:
    Regex.IsMatch("任意值",@"(?<!^all$)$");除了abc外,任何值都会返回false。谢谢小熊让我发现了方向。
                  ----楼主  (顶楼问题的正确答案)
      

  25.   

    http://community.csdn.net/Expert/topic/4983/4983948.xml?temp=.7148706
      

  26.   

    Regex.IsMatch("任意值",@"(?<!^all$)$");除了abc外,任何值都会返回false。如果是这样的
    "任意值"=="abc" 
    除了abc,任何值都会返回false. 不是一样的么?有必要这么做么??
      

  27.   

    除了abc外,任何值都会返回true。如果是这样的
    "任意值"!="abc" 
    除了abc,任何值都会返回true. 不是一样的么?有必要这么做么??
      

  28.   

    to jingtao_zhou(小熊):
    从这里看确实没有必要。而我用的这种方法又不能应用到后面所列的场景中。
    其实从根本上讲,这个问题还是没解决。重新描述一下我的根本意图:[^(all)]+
    从这个可以大致看出我的目的,就是想得到:如何匹配一个不是abc的值。(可以是a可以是l,但不能是all)
    我写的这个正则匹配的实际效果是all()这五个字符外的任意字符,当然,不是我想要的。
      

  29.   

    问题是你怎么区分all?你说的
    匹配:43alll3232,3al3,4b3
    但不匹配:3all3,4all89
    就是说all后跟哪些字符才是要的?
      

  30.   

    表达式
    ^[\w]*?(?<!((all)+[\d]*))$
    如果出现all后面跟数字就不匹配
      

  31.   

    try 
    <?(all)all/D+|/D+>
    no test
      

  32.   

    为了方便,我就跟贴一下了啦,兄弟不介意吧,写一个关于验证Email地址的合法性的正则表达能这样写么?/(^[a-zA-Z]|^[a-zA-Z][\w-_\.]*[a-zA-Z0-9])@(\w+\.)+\w+$/
      

  33.   

    呵呵,我再表达一下我的意思吧:用[^a]可以匹配任意除a以外的字符。
    能不能实现这种语义(^(ab))即匹配除ab以外的任意字符?而ac和cb都可以正常匹配。
    (假如用[^a][^b]就不能匹配ac,cb)
      

  34.   

    ([^a][^b])|(ac)|(cb)
    ??
    其实我觉得你有点在钻进死胡同了
    都有点不知道你到底要什么了。
    很多时候要具体的问题具体解决
    如果你想要 
    1:判断一个句子中是否有abc那么 有的话不匹配  没的话匹配
    那么 Regex reg = new Regex ("abc");  reg.Match(string) 就可以得到是否匹配
    2:如果你想替换掉abc的话  笔直用replace
    3: 如果你想获得除了abc外的其它字符 那么把他 replace后赋值就可以了
    4:。。
    很多具体的情况都能有;类似的变通的方法。。
      

  35.   

    to redwolf_123(雨恨云愁):我想在一段字符中取出一个数字开头中间不是abc一个数字结尾的值。比如如下一段:2acb44xss4ce2abc3
    我希望取出的是:2acb4,4xss4可能我确实是在钻牛角尖,但我觉得有意义。最起码有这样的实例场景(我是碰到一个CSDN中的问题刚好需要这样才发现并提问的),如果能找到最简便的方法不是很好吗?(因为对正则算是在学习期,所以不清楚到底可不可以用一个正则去匹配)
      

  36.   

    我终于又找到解了:\d(?!ab\d).{2}(?<!\dab)\d
    这个表达式匹配前面一个数字后面一个数字中间任意两个字符,但这两个字符不能是ab发现要做到我说的这一点,必须根据上下文写,才写得出。
    \d(?!ab\d)表示匹配前面的一个数字,但这个数字后面不能跟ab加一个数字
    .{2}表示任意两位字符。
    (?<!\dab)\d表示匹配最后的一个数字,但这个数字前面不能跟一个数字加ab于是就达到前面一个数字,后面一个数字,中间两位任意字符但不能是ab的效果。呵呵,希望对大家有帮助。
      

  37.   

    应用场景:http://community.csdn.net/Expert/topic/5001/5001405.xml?temp=.8021967根据这个实际需求和回复,你可以看到真正的用法。大概就是:((?!abc).(?<!abc))*?