少了条反斜线转义:String s1 = "([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})\\s-\\s-\\s[([^\]]+)\\]";String s1 = "([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})\\s-\\s-\\s[([^\\]]+)\\]";
java的字符串里\\才表示\,而正则表达式里\\才表示\。因此要表示正则表达式里的\,java的字符串里就要写成了\\\\,
比如下例,是把一条斜线替换成两条斜线: /**
* 用来对字符串进行转义处理,以保证可以正确插入到postgreSQL数据库中
* @param str String
* @return String
*/
public static String FilterPostgresSQLString(String str) {
return str == null ? str : str.replaceAll("\\\\",
"\\\\\\\\").replaceAll("'",
"''");
}ps :《Java正则表达式详解》我没有完全看完过,有错的地方,我也不太清楚。附一个以前写的ip校验的正则表达式:
public static boolean isValidIPAddr(String aString) {
//IPV4的地址是四段的。长度在7到15 之间,每一段的大小为[0-255]
//利用正则表达式之能够约束到三位的时候,最高位置能够是0,1,2开头
if (aString == null || aString.length() < 7 || aString.length() > 15) {
return false;
}
if (ipAddrPattern == null) {
ipAddrPattern = Pattern.compile(
"^([012]?[\\d]{1,2}\\.){3}[012]?[\\d]{1,2}$");
// 不约束最高位的正则表达式="^([\\d]{1,3}\\.){3}[\\d]{1,3}$");
//可以加强一下对三位的ip的验证,最大只能够是用0,1,2开头的
//"^(([\\d]{1,2}\\.){3}[\\d]{1,2})|(([012][\\d]{1,2}\\.){3}[012][\\d]{1,2})$"
}
return ipAddrPattern.matcher(aString).find();
}
解决方案 »
- myeclipse自动提示的内容能修改吗?
- 在线求大虾帮忙 急急急!! 一个关于this和super外加toString()方法的问题
- 无法读取Resultset结果!!!!!!奇怪 求大侠
- 初学JAVA,Java applet和JSP有点混淆
- 读取文件
- java 发送Email,碰到530错误
- 请大家帮帮忙啊,在上课的时候遇到的问题啊!就是用JAVA和SQL SERVER的连接问题
- 为什么import xxx.ClassName;可以,而import xxx.*;不行?
- 简单问题,马上结贴
- 线程问题,拜托各位大虾帮忙,小生有理了:)
- 请教各位老师一个取配置文件test.property的值的问题。。。
- 请各位高手指教小弟一个问题,有关于JAVA简单程序题!谢谢!
你 是说这行吗???
([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\s-\s-\s[([^\]]+)\]所有的\都要写成\\。java才认识.正则表达式里]也需要转义,因此就要写成\],再加上java的转义,所以要写成\\].
public static void main(String args[]){
Pattern pattern = null;
Matcher matcher = null;
String s1 = "([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})\\s-\\s-\\s[([^\\]]+)\\]";
System.out.println("s1 = "+s1);
String s2 = "172.26.155.241 - - [26/Feb/2001:10:56:03 -0500]\"GET/IsAlive.htm HTTP/1.0\"200 15 ";
System.out.println("s2 = "+s2);
// Match true
pattern = Pattern.compile(s1);
matcher = pattern.matcher(s2);
while (matcher.find()){
System.out.println("matcher.group(0) = "+matcher.group(0));
System.out.println("matcher.group(1) = "+matcher.group(1)); }
}
}错误:
s1 = ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\s-\s-\s[([^\]]+)\]
s2 = 172.26.155.241 - - [26/Feb/2001:10:56:03 -0500]"GET/IsAlive.htm HTTP/1.0"200 15
java.util.regex.PatternSyntaxException: Unclosed character class near index 66
([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\s-\s-\s[([^\]]+)\]
^
at java.util.regex.Pattern.error(Pattern.java:1528)
at java.util.regex.Pattern.clazz(Pattern.java:2042)
at java.util.regex.Pattern.sequence(Pattern.java:1585)
at java.util.regex.Pattern.expr(Pattern.java:1545)
at java.util.regex.Pattern.compile(Pattern.java:1279)
at java.util.regex.Pattern.<init>(Pattern.java:1035)
at java.util.regex.Pattern.compile(Pattern.java:779)
at RegexTest.main(RegexTest.java:15)
Exception in thread "main"
Process completed.
String s1 = "([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})\\s-\\s-\\s\\[([^\\]]+)\\]";[也是需要转义的\\[
最后那部分[([^\\]]+)\\]";应该是\\[([^\\]]+)\\]";to andy100085(铁桶师傅):转义表示即可\.。在java字符串里则是\\.你如果仔细看上面的回复,就会发现到处都用到了的。
System.out.println("s1 = "+s1);
String s2 = "172.26.155.241 - - [26/Feb/2001:10:56:03 -0500]\"GET/IsAlive.htm HTTP/1.0\"200 15 ";
System.out.println("s2 = "+s2);打印出匹配的两个部分while (matcher.find()){
//System.out.println("matcher.group(0) = "+matcher.group(0));
System.out.println("matcher.group(1) = "+matcher.group(1));
System.out.println("matcher.group(2) = "+matcher.group(2));
}
------------------------------------------------------------
还是有个问题,请看:Exmple: 分析一个Web服务器日志文件,确定每一个用户花在网站上的时间。在典型的BEA WebLogic日志文件中,日志记录的格式如下:
172.26.155.241 - - [26/Feb/2001:10:56:03 -0500]\"GET/IsAlive.htm HTTP/1.0\"200 15
分析这个日志记录,可以发现,要从这个日志文件提取的内容有两项:IP地址和页面访问时间。你可以用分组符号(圆括号)从日志记录提取出IP地址和时间标记。
首先我们来看看IP地址。IP地址有4个字节构成,每一个字节的值在0到255之间,各个字节通过一个句点分隔。因此,IP地址中的每一个字节有至少一个、最多三个数字。显示了为IP地址编写的正则表达式:
\d{1,3} \. \d{1,3} \. \d{1,3} \. \d{1,3}
IP地址中的句点字符必须进行转义处理(前面加上“\”),因为IP地址中的句点具有它本来的含义,而不是采用正则表达式语法中的特殊含义。句点在正则表达式中的特殊含义本文前面已经介绍。
日志记录的时间部分由一对方括号包围。你可以按照如下思路提取出方括号里面的所有内容:首先搜索起始方括号字符(“[”),提取出所有不超过结束方括号字符(“]”)的内容,向前寻找直至找到结束方括号字符。显示了这部分的正则表达式:
\[ [ ^] ]+ \]
现在,把上述两个正则表达式加上分组符号(圆括号)后合并成单个表达式,这样就可以从日志记录提取出IP地址和时间。注意,为了匹配“- -”(但不提取它),正则表达式中间加入了“\s-\s-\s”。完整的正则表达式如下所示:
(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) \s-\s-\s \[([^]]+)\]
------------------------------------------------------------------------------------
问题:我么在java中变换的正则表达式,最终也要符合我上面的分析出的正则表达式呀但是为了匹配第二个圆括号中的值,我们改成这样了:[([^\\]]+)\\]“验证java中你的正则表达式写的对不对,最好的办法是打印出来看于原来的一样不?”--这是文章中的一句话,我们现在打印出来的s1为:
([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\s-\s-\s\[([^\]]+)\]于原来的正则表达式不一样了呀?这是为什么?这样做对不?谢谢楼下的您!!
《Java正则表达式详解》好文章