编写环境:
Windows 7 X64,JDK 1.7(7.0) X64
工程版本:
J2SE 1.5(5.0)我在此环境编写了一个小东西、打包成jar包、本地运行成功、但是发给别人运行后竟然提示正则表达式编译错误目标运行环境:
WIN XP X86,JDK 1.6(6.0) X86运行后提示:
Exception in thread "main" java.util.regex.PatternSyntaxException: Look-behind group does not have an obvious maximum length near index 27
nick-name="(?<username>[^"]+)"相关代码: Pattern ptnNickName = Pattern
.compile("nick-name=\"(?<username>[^\"]+)\"");这个正则表达式妥妥的是没有问题的呀?为何在别人的机器上运行会提示正则错误?
难道不同版本JDK对正则的实现不同?但是我指定工程版本是1.5的、那理论上不是应该都是向下兼容的、那不都一样了吗?
Windows 7 X64,JDK 1.7(7.0) X64
工程版本:
J2SE 1.5(5.0)我在此环境编写了一个小东西、打包成jar包、本地运行成功、但是发给别人运行后竟然提示正则表达式编译错误目标运行环境:
WIN XP X86,JDK 1.6(6.0) X86运行后提示:
Exception in thread "main" java.util.regex.PatternSyntaxException: Look-behind group does not have an obvious maximum length near index 27
nick-name="(?<username>[^"]+)"相关代码: Pattern ptnNickName = Pattern
.compile("nick-name=\"(?<username>[^\"]+)\"");这个正则表达式妥妥的是没有问题的呀?为何在别人的机器上运行会提示正则错误?
难道不同版本JDK对正则的实现不同?但是我指定工程版本是1.5的、那理论上不是应该都是向下兼容的、那不都一样了吗?
我写的JDK1.7
运行的JDK1.6在运行的地方提示编译错误、而且觉得这个正则表达式应该都支持的...另外还有一个地方、我封装了这样的一个方法public static ResponsePackage doPost(String reqUrl, Map parameters,
String recvEncoding, RequestPackage requestPackage) {
HttpURLConnection url_con = null;
String responseContent = null;
ResponsePackage result = new ResponsePackage(); try {
StringBuffer params = new StringBuffer();
for (Iterator iter = parameters.entrySet().iterator(); iter
.hasNext();) {
Entry element = (Entry) iter.next();
params.append(element.getKey().toString());
params.append("=");
params.append(URLEncoder.encode(element.getValue().toString(),
HttpRequestProxy.requestEncoding));
params.append("&");
} if (params.length() > 0) {
params = params.deleteCharAt(params.length() - 1);
} URL url = new URL(reqUrl);
url_con = (HttpURLConnection) url.openConnection();
url_con.setDoOutput(true);
url_con.setDoInput(true);
HttpURLConnection.setFollowRedirects(true);
url_con.setInstanceFollowRedirects(true); HttpRequestProxy.setRequestPackage(url_con, requestPackage); url_con.setRequestMethod("POST");
url_con.setConnectTimeout(connectTimeOut);
url_con.setReadTimeout(readTimeOut); byte[] b = params.toString().getBytes();
url_con.getOutputStream().write(b, 0, b.length);
url_con.getOutputStream().flush();
url_con.getOutputStream().close();
url_con.connect(); InputStream in = url_con.getInputStream();
result.cookies = HttpRequestProxy
.getCookie(url_con, requestPackage);
BufferedReader rd = new BufferedReader(new InputStreamReader(in,
recvEncoding));
String tempLine = rd.readLine();
StringBuffer tempStr = new StringBuffer();
String crlf = System.getProperty("line.separator");
while (tempLine != null) {
tempStr.append(tempLine);
tempStr.append(crlf);
tempLine = rd.readLine();
}
responseContent = tempStr.toString(); // result.cookies = url_con.getHeaderField("set-cookie"); result.client = requestPackage.client; rd.close();
in.close();
} catch (IOException e) {
System.out.println("doPost Exception:" + e.getMessage());
} finally {
if (url_con != null) {
url_con.disconnect();
}
} result.responseHtml = responseContent; return result;
}
在我编写的环境一切正常、在目标环境(JDK1.6)下面、在执行到InputStream in =url_con.getInputStream();这一行的时候抛出异常、是文件找不到(但是我确定网络资源是存在的、而且浏览器里也是能打开的)、同样这也是为什么呢?这又该如何解决呢?
可能不能在1.5下欲行
不知道楼主的出错的运行具体环境是什么样的
其实LZ是想对捕获的用一个组名来记录,也就是(?<groupname>)的方式,通过${groupname}来读取,可能1.7以前的版本对这样的支持不好,导致正则解析出错,
"nick-name=\"(?<username>[^\"]+)\""; 改成 "nick-name=\"([^\"]+)\""; 用$1来读取可能兼容性更好一些
编写环境:Windows 7 X64,JDK 1.7(7.0) X64
运行环境:WIN XP X86,JDK 1.6(6.0) X86
我的工程就是最简单的J2SETO 10F
光是这个正则问题 还是有办法变通的、比如就是命名分组改成用编号访问、不过这样的现象、让我着实很奇怪TO 11F
我本地编写的环境是1.7、可我工程版本是1.5、那不就是1.5的么?工程版本低于JDK版本应该就可以正常运行的不是吗?那样的话我编写的环境(1.7)和运行的环境(1.6)都高于工程版本(1.5)了、那么按照我的理解、应该是运行结果是一致的、不然不就不符合Java的“一次编译 到处运行”的说法了吗?
就是eclipse里新建工程的时候 应该有个选项让你选择使用的JDK版本吧?
nick-name="(?<username>[^"]+)"look-behind group不支持 没有明显最大长度的 表达式含有导致不确定长度量词+ *等