首先 问题: 有一段内容 
            内容可能是纯净的文本 或者 含有html标签
            如:fsdfsfs <font color="slategray">撒旦飞洒a撒范德萨...a </font>fsfdsfsdfds           要实现:将html标签外的a 替换成 b  而标签体内的a 不受影响即上段内容中<font>标签中 color属性值中的字符a不能被替换 
          希望能给出正则表达式以及替换方法

解决方案 »

  1.   

    撒旦飞洒a撒范德萨...a
    这里面的两个a也要换掉么?
      

  2.   

    你Google下过滤器模式,如果打算采用可以给我留言,我家里应该有过滤器模式相关资料,给你翻翻,呵呵。
      

  3.   

    //以下代码把小写a替换成大写A
    StringBuffer sb=new StringBuffer();
    Pattern p = Pattern.compile("<[^>]*>");
    String s="fsdfsfs <font color=\"slategray\">撒旦飞洒a撒范德萨...a </font>fsfdsfsdfds ";
    String[] splits=p.split(s+" ");//结尾加空格,最后是标签;
    Matcher m=p.matcher(s);
    int i=0;
    if(s.charAt(0)!='<' && splits.length>0){
    sb.append(splits[0].replaceAll("a","A"));
    i++;
    }
    while (m.find()) {
    sb.append(m.group()+splits[i++].replaceAll("a","A"));

    }
    System.out.println(sb.toString());
      

  4.   

    动动脑筋嘛,你是一碰到问题就哎!str = str.replaceAll("((?:[^<a>]*<[^<>]+>)*)a+", "$1");
      

  5.   

    不想这个有问题  你吧上面<font color="slategray">里面的a给替换了
      

  6.   

    这种需求在.NET中用正则+委托倒是一行代码就搞定了,不过在Java中MS没有提供这种处理方式楼主的需求,只需考虑是否在标签内就可以了,与标签是否有嵌套没什么关系与其局限在正则上,绕着弯去非要用正则实现,效率较低,倒不如考虑一下更好的实现方式正则也不过是一种有穷自动机,针对这种具体需求,完全可以自己写有穷自动机来实现

    String test = "fsdfsfs <font color=\"slategray\">撒旦飞洒a撒范德萨...a </font>fsfdsfsdfds ";
    Boolean flag = false;
    char c;
    StringBuffer sb = new StringBuffer();
    for(int i=0;i<test.length();i++)
    {
    c = test.charAt(i);
    if(flag)
    {
    if(c == '>')
    {
    sb.append('>');
    flag = false;
    }
    else
    {
    sb.append(c);
    }
    }
    else
    {
    if(c == '<')
    {
    sb.append('<');
    flag = true;
    }
    else if(c == 'a')
    {
    sb.append('b');
    }
    else
    {
    sb.append(c);
    }
    }
    }
    System.out.println(sb.toString());以上代码可以更加抽象化,有时间的人优化下吧
      

  7.   


    为啥这个非要用正则表达式? 
    用个stack不就好了读到"<" ">"就放入stack 如果stack顶部为“>”遇到“a”则替换...超级简单的词法解析
      

  8.   

    接上面的...艾编译原理阿... String str="fsdfsfs <font color=\"slategray\">撒旦飞洒a撒范德萨...a </font>fsfdsfsdfds ";

    //替换
    char[] chars=str.toCharArray();
    Stack<Character> stack=new Stack<Character>(); //可以改良stack实现来优化性能
    for (int i = 0; i < chars.length; i++) { //简单过滤<...>标签  需要的话增加该词法解析的功能
    switch(chars[i]){
    case '<' : 
    stack.push('<');break;
    case '>' : 
    if(stack.peek()=='<')stack.pop();break;
    case 'a' : 
    if(stack.isEmpty()==true)chars[i]='b';break;
    default:
    break;
    }


    //显示
    System.out.println(new String(chars));
      

  9.   

    从你第二帖 过来的。。
            String str="fsdfsfs <font color=\"slategray\">撒旦飞洒a撒范德萨...a </font>fsfdsfsdfds ";
            
            //替换
            char[] chars=str.toCharArray();
            Stack<Character> stack=new Stack<Character>(); //可以改良stack实现来优化性能
            for (int i = 0; i < chars.length; i++) { //简单过滤<...>标签  需要的话增加该词法解析的功能
                switch(chars[i]){
                case '<' : 
                    stack.push('<');break;
                case '>' : 
                    if(stack.peek()=='<')stack.pop();break;
                case 'a' : 
                    if(stack.isEmpty()==true)chars[i]='b';break;
                default:
                    break;
                }
            } 
            
            //显示
            System.out.println(new String(chars));
      

  10.   

    现在用的是 Pattern p = Pattern.compile("(?!<[^>]*)(a)(?![^<]*>)");
            Matcher m = p.matcher(content);
            m.replaceAll(replaceStr);接下来的问题是如何将此正则转换证mysql的正则  达到同样的效果
      

  11.   

    我不会正则,但应该可以写的吧,把">" 和 “<”之间的并且不在“<”和“>”之间的a换掉
      

  12.   

    因为数据是从数据库来的 数据库mysql5.1首先要查出来符合的 再替换后面还有一部操作库的  要用正则匹配 直接修改记录
      

  13.   


    Java中不是不支持逆序环视中使用不定长度量词吗?这是哪个类库中支持的现在没有环境,不能测试
      

  14.   


    这个不大清楚 找的是php里用的一段正则修改的 测试可用
      

  15.   

    你后面的表达不是很清楚,再说
    Pattern p= Pattern.compile("(?!<[^>]*)(a)(?![^<]*>)"); 是替换标签中的a呀,你到底要替换哪个,外面的或里面的
      

  16.   

    替换的是标签外的a   (?! <[^>]*)这个应该是非捕获的
      

  17.   

    to27楼,你那么写是替换里面的,你试试就知道了,应该是Pattern p = Pattern.compile("(<[^>]*)(a)([^<]*>)");
    mysql查询方法:select * from tablename where username REGEXP '<[^>]*(a)[^<]*>'
    你可以自己在改改,解决了就结贴吧
      

  18.   

    你这个明显是找到<.a.>这个的不符合需求
      

  19.   

    select * from tablename where username REGEXP ' <[^>]*(a)[^ <]*>'
    你试了吗?没试可别这么说
      

  20.   


    有没有标签嵌套的情况
    比如
    <a>fsdfsfs <font color="slategray">撒旦飞洒a撒范德萨...a </font>fsfdsfsdfds</a>
      

  21.   

    http://do.jhost.cn/sunshine/ReadNews?action=read&id=105http://do.jhost.cn/sunshine/ReadNews?action=read&id=106
      

  22.   


    Java 中不支持逆序环视中的不定长度量词,但这是顺序环视哦。改正了一下,这样就好了:str = str.replaceAll("((?:[^<a>]*(?:<[^<>]+>)*)*)a+", "$1");
      

  23.   

    眼花了,原来这样用的其实按20楼的写法,(?!<[^>]*)这个没意义
    因为按正则表达式本身的要求,后面必须接a才能匹配,所以这一判断是肯定满足的,从语法角度分析,这个就是没意义的其实楼主的这个需求简单,如果能保证源字符串中的标签都闭合,下面的就可以了,这个基本上是所有语言中都通用的
    str = str.replaceAll("a(?![^<>]*<)", "b");
      

  24.   

    现在决定使用(?!<[^>]*)(a)(?![^<]*>)
    39#和41#朋友的表达式 还有点问题 呵呵现在的问题 如何将 (?!<[^>]*)(a)(?![^<]*>)  转换成mysql能识别的表达式
      

  25.   

    select REPLACE(uname,'<*>','') from a where uname REGEXP '(<[^>]*>)+[^>]*a' 
    or (uname not regexp '(<[^>]*>)+' and uname LIKE '%a%')
      

  26.   

    发错了重发
    select * from a where uname REGEXP '(<[^>]*>)+[^>]*a' 
    or (uname not regexp '(<[^>]*>)+' and uname LIKE '%a%')
      

  27.   


    转换成mysql 可用的正则依然无结果  mysql区的贴一天了0回复绕行了
      

  28.   

    晕 弄半天不是java问题 你要用在mysql环境里面阿?
    LZ太忽悠人了 要知道每个重则表达式环境之间都有可能不同的grep vi 或者js 或者java都会有小部分区别的 
    反正mysql不会
      

  29.   

    http://shiyangxt.javaeye.com/blog/293068
    你可以去这里看看
      

  30.   

    java 环境和 mysql 都要用呵呵