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。
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());
} }}基本上满足你的要求, 不知道有没有什么纰漏
Pattern p = Pattern.compile(".*func=public.*");结果取反就是你想要的结果了
首先非常感谢,我在1楼又补充了一个限制条件,可能你没看到:还有一点:func=可能不是第一个参数如果func不是第一个参数的话,就全部是false了。因为你限定了?后面的第一个参数必须是func,这样的话,只需要后面的字符串里面不出现func就可以了。比如:"/home/page.do?aa=bb&func=show&id=600002256"
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());
}
}
"((?<!func=).)*func=(?!public)(.(?!func=))*"加个=号比较不容易误判了吧.
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()方法。
Pattern p = Pattern.compile(".*\\?((?<!func).)*func=(?!((public)|(.*func)+)).*");
和你这个就匹配不上。其实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()));
}
}
}
他的意思是凡是查找到存在func=public或者没有func的字符串 就是把你的条件反过来.*\?{1}func=[^p]+[^func]*我刚才写了一个 貌似不咋地 只能完成LZ目前提供的四个字符串的匹配
测试地址 http://regexpal.com/
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());
}
}
func=可能不是第一个参数这个算不算需求?我学正则表达式就是看了你的那个教程开始的,一直挺崇拜你,不过说是在的,你的回复挺让我失望的
你的需求写的位置也太……
很少有人去注意运算结果后面的东西的说。
其实14楼的也不能满足你的要求(原因自己想吧),比较完整的应该是:
"((?<![?&]func=).)*[?&]func=(?!public)(.(?![?&]func=))*"
非常感谢提醒,应该判断一下func前面的字符,才能更准确,
否则http://www.xyz.com/home/page.do?aa=bb&afunc=list这样的串也变成符合条件的了