Pattern p = Pattern.compile(".*?func=(?!public.*).*");
String[] str = { 
"http://www.xyz.com/home/page.do?func=publicshow&id=600002256", 
"http://www.xyz.com/home/page.do?func=publiclist", 
"http://www.xyz.com/home/page.do?func=show&id=600002256", 
"http://www.xyz.com/home/page.do?func=list", 
"http://www.xyz.com/home/page.do?func=publiclist&func=list", 
"http://www.xyz.com/home/page.do?func=list&func=publiclist", 
"http://www.xyz.com/home/page.do?func=list&func=publiclist&func=list", 
};
现在的输出结果是:
false
false
true
true
true
true
true
我要做的是输出:
false
false
true
true
false
false
false
也就是url里面只能出现一次func=,如果func=后面的参数以public开头输出false,否则是true。

解决方案 »

  1.   

    还有一点:func=可能不是第一个参数
      

  2.   


    package foundations.string;import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class LookingBeforeMatch {

    public static void main(String[] args)
    {
    Pattern p = Pattern.compile(".*\\?func=(?!((public)|(.*func)+)).*");
    String[] str = { 
                    "http://www.xyz.com/home/page.do?func=publicshow&id=600002256", 
                    "http://www.xyz.com/home/page.do?func=publiclist", 
                    "http://www.xyz.com/home/page.do?func=show&id=600002256", 
                    "http://www.xyz.com/home/page.do?func=list", 
                    "http://www.xyz.com/home/page.do?func=publiclist&func=list", 
                    "http://www.xyz.com/home/page.do?func=list&func=publiclist", 
                    "http://www.xyz.com/home/page.do?func=list&func=publiclist&func=list", 
    };
    Matcher m = null;
    for (String s: str) {
    m = p.matcher(s);
    System.out.println(m.matches());

    } }}基本上满足你的要求, 不知道有没有什么纰漏
      

  3.   


    Pattern p = Pattern.compile(".*func=public.*");结果取反就是你想要的结果了
      

  4.   


    首先非常感谢,我在1楼又补充了一个限制条件,可能你没看到:还有一点:func=可能不是第一个参数如果func不是第一个参数的话,就全部是false了。因为你限定了?后面的第一个参数必须是func,这样的话,只需要后面的字符串里面不出现func就可以了。比如:"/home/page.do?aa=bb&func=show&id=600002256"
      

  5.   


    public static void main(String[] args) throws IOException,ClassNotFoundException
        {
         String[] str = { 
                    "http://www.xyz.com/home/page.do?func=publicshow&id=600002256", 
                    "http://www.xyz.com/home/page.do?func=publiclist", 
                    "http://www.xyz.com/home/page.do?func=show&id=600002256", 
                    "http://www.xyz.com/home/page.do?func=list", 
                    "http://www.xyz.com/home/page.do?func=publiclist&func=list", 
                    "http://www.xyz.com/home/page.do?func=list&func=publiclist", 
                    "http://www.xyz.com/home/page.do?func=list&func=publiclist&func=list", 
         };
         Pattern p = Pattern.compile("((?<!func).)*func=(?!public)(.(?!func))*");
         Matcher m = null;
         for(String s : str){
         m = p.matcher(s);
         System.out.println(m.matches());
         }
        }
      

  6.   


    "((?<!func=).)*func=(?!public)(.(?!func=))*"加个=号比较不容易误判了吧.
      

  7.   


    Pattern p = Pattern.compile(".*?func=(public.*?).*");
    String[] str = { 
                    "http://www.xyz.com/home/page.do?func=publicshow&id=600002256", 
                    "http://www.xyz.com/home/page.do?func=publiclist", 
                    "http://www.xyz.com/home/page.do?func=show&id=600002256", 
                    "http://www.xyz.com/home/page.do?func=list", 
                    "http://www.xyz.com/home/page.do?func=publiclist&func=list", 
                    "http://www.xyz.com/home/page.do?func=list&func=publiclist", 
                    "http://www.xyz.com/home/page.do?func=list&func=publiclist&func=list", 
    };
    for (String string : str) {
    Matcher m = p.matcher(string);
    System.out.println(!m.find());
    }
    正则其实也可以这样用,不一定要使用matchers()方法。
      

  8.   

    汲取 14 楼兄弟的思想:
    Pattern p = Pattern.compile(".*\\?((?<!func).)*func=(?!((public)|(.*func)+)).*");
      

  9.   

    这个不对,比如"http://www.xyz.com/home/page.do?func=list&func=abc"
    和你这个就匹配不上。其实LZ用不着那么死脑筋,正过来不好匹配就反过来匹配就得了呗:public class Test5 {
    public static void main(String[] args) {
    Pattern p = Pattern.compile(".*[?&]func=public.*");
    String[] str = {
    "http://www.xyz.com/home/page.do?func=publicshow&id=600002256",
    "http://www.xyz.com/home/page.do?func=publiclist",
    "http://www.xyz.com/home/page.do?func=show&id=600002256",
    "http://www.xyz.com/home/page.do?func=list&func=abc",
    "http://www.xyz.com/home/page.do?func=publiclist&func=list",
    "http://www.xyz.com/home/page.do?func=list&func=publiclist",
    "http://www.xyz.com/home/page.do?func=list&func=publiclist&func=list", }; for (String str1 : str) {
    System.out.println(!(p.matcher(str1).matches()));
    }
    }
    }
      

  10.   


    他的意思是凡是查找到存在func=public或者没有func的字符串 就是把你的条件反过来.*\?{1}func=[^p]+[^func]*我刚才写了一个 貌似不咋地 只能完成LZ目前提供的四个字符串的匹配
    测试地址 http://regexpal.com/
      

  11.   


        public static void main(String[] args) throws IOException,ClassNotFoundException
        {
         String[] str = { 
                    "http://www.xyz.com/home/page.do?func=publicshow&id=600002256", 
                    "http://www.xyz.com/home/page.do?func=publiclist", 
                    "http://www.xyz.com/home/page.do?func=show&id=600002256", 
                    "http://www.xyz.com/home/page.do?func=list", 
                    "http://www.xyz.com/home/page.do?func=publiclist&func=list", 
                    "http://www.xyz.com/home/page.do?func=list&func=publiclist", 
                    "http://www.xyz.com/home/page.do?func=list&func=publiclist&func=list", 
         };
         /*
          * (?<!func=).)*表示寻找的func=前面有0个或者多个任意字符.但是这个任意字符的左边不能有func=
          * (.(?!func=))* 表示寻找的func=后面有0个或者多个任意字符.但是这个任意字符的右边不能有func=
          * 也就是只能有一个func=了,而且func=(?!public)表示紧挨着它右边的不能是public
          */
         Pattern p = Pattern.compile("((?<!func=).)*func=(?!public)(.(?!func=))*");
         Matcher m = null;
         for(String s : str){
         m = p.matcher(s);
         System.out.println(m.matches());
         }
        }
      

  12.   

    ....不仅是public 凡是带p的都不能作为参数了 我实在是忘记了如何不匹配单词了...
      

  13.   

    在0或多个左边不是func=的任意字符的后面跟着func=(?!public),后面再跟着0或多个右边都不是func=的任意字符.
      

  14.   

    也就是url里面只能出现一次func=,如果func=后面的参数以public开头输出false,否则是true。
    func=可能不是第一个参数这个算不算需求?我学正则表达式就是看了你的那个教程开始的,一直挺崇拜你,不过说是在的,你的回复挺让我失望的
      

  15.   

    #24
    你的需求写的位置也太……
    很少有人去注意运算结果后面的东西的说。
    其实14楼的也不能满足你的要求(原因自己想吧),比较完整的应该是:
    "((?<![?&]func=).)*[?&]func=(?!public)(.(?![?&]func=))*"
      

  16.   


    非常感谢提醒,应该判断一下func前面的字符,才能更准确,
    否则http://www.xyz.com/home/page.do?aa=bb&afunc=list这样的串也变成符合条件的了