我要用java匹配一个字符串,如果该字符串是以标点符号开头或结尾的,我就要把这些标点去掉,但是有几个特殊的词例外,如".net"这样的词如果在字符串前面则不匹配,如"c++"、"c#"这样的在字符串后面也不匹配,我自己写了一个:
               ^[\p{Punct}]*(?!net)|(?<!(c|c\+))[\p{Punct}]*$但实际上并不对,诸如"&net"、"@net"、"c-"、"c}"这样的词和".net"、"c++"、"c#"这些词一样不被处理。
各位大侠有没有更好的方法。先谢谢了!

解决方案 »

  1.   

    public static void main(String[] args) {
    String[] a={"@abc","bc%",".net","@net","c++","c#","c%%"};
    String reg="^(?!\\.net)[\\W]+";
    String reg2="[\\W]+(?<!(c\\+\\+|c#))$";
    for(int i=0;i<a.length;i++){
    a[i]=a[i].replaceAll(reg, "").replaceAll(reg2, "");
    System.out.println(a[i]);
    } }
    这样试试
      

  2.   

    我主要是在solr里面的PatternReplaceFilterFactory用的,最后的配置写成:
    <filter class="solr.PatternReplaceFilterFactory" pattern="^(\p{Punct})*(?!net)|(?&lt;!(c|c\+))(\p{Punct})*$" replacement="$2"/>
    <filter class="achievo.support.analyzers.StrProcessTokenFilterFactory"/>
    下面的那个filter是我自己写的,做二次处理,不过还是谢谢上面两位