学习《Java正则表达式详解》中举的第一个例子后,一个问题:

frhwxx 2004-11-10 06:02:05
本人看完网友发的帖子《一个关于 java 正则表达式的问题》——URL:

http://community.csdn.net/Expert/topic/3506/3506609.xml?temp=.7999079

学习完《Java正则表达式详解》——URL:

http://www.ccw.com.cn/htm/app/aprog/01_7_31_4.asp

有一问题:

在文章中 “3.1 日志文件处理”举的例子当中的正则表达式到底该怎么写

照文章中这样写肯定不会有正确结果的,不行?请看Program:

import java.util.regex.*;

public class RegexTest{

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.

按照本文说的正则表达式的写法我认为应该写成这样:

import java.util.regex.*;

public class RegexTest{

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)); }
}
}

但是Java编译时不通过,错误:

RegexTest.java:9: illegal escape character
String s1 = "([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})\\s-\\s-\\s[([^\]]+)\\]";
^
1 error
Process completed.

-----------------------------------------------------------------------------------------

高手们你们看看像这样的话,我们遇到这种情况应该这么写?

这里尤其请 网友:
pigo(~_~ ^-^. 。o 0 O O=8526 && 1562=O O 0 o 。. ^-) 进来说说

谢谢楼下的!!

...全文
671 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengliu212 2004-11-11
  • 打赏
  • 举报
回复
http://www.ccw.com.cn/htm/app/aprog/01_7_31_4.asp
《Java正则表达式详解》好文章
pigo 2004-11-11
  • 打赏
  • 举报
回复


归根到底是字符转义问题。

\\是写给java看的。

而\是java输出给你看的,

刚才去看一眼那篇文章,应该那里的正则表达式写疏忽了,也少了个转移的斜线(但是其它两处用到中括号的地方是正确转义的了).

frhwxx 2004-11-11
  • 打赏
  • 举报
回复
to pigo(随遇),

我知道这个程序哪儿错了,首先谢谢你的指点!
------------------------------------------------------------
还是有个问题,请看:

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\[([^\]]+)\]

于原来的正则表达式不一样了呀?这是为什么?这样做对不?

谢谢楼下的您!!

皮鲁 2004-11-11
  • 打赏
  • 举报
回复
注意\\s后面的“[”字符,要转义,加上\\

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);

打印出匹配的两个部分

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));
}
frhwxx 2004-11-11
  • 打赏
  • 举报
回复
哦?我试试你说的
pigo 2004-11-11
  • 打赏
  • 举报
回复
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\\[([^\\]]+)\\]";

[也是需要转义的\\[


最后那部分[([^\\]]+)\\]";

应该是\\[([^\\]]+)\\]";

to andy100085(铁桶师傅):

转义表示即可\.。在java字符串里则是\\.你如果仔细看上面的回复,就会发现到处都用到了的。
新来的萌新 2004-11-11
  • 打赏
  • 举报
回复
借宝地问个问题:要是想匹配 . 怎么办?他可是通配符啊~~~
umbrella1984 2004-11-11
  • 打赏
  • 举报
回复
oh!多谢了,马上去看看。。呵呵
frhwxx 2004-11-11
  • 打赏
  • 举报
回复
to umbrella1984(雨伞) ,我上面不是写出了《Java正则表达式详解》URL吗!

http://www.ccw.com.cn/htm/app/aprog/01_7_31_4.asp
frhwxx 2004-11-11
  • 打赏
  • 举报
回复
我这样写也出错误,请看:

import java.util.regex.*;

public class RegexTest{

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.
frhwxx 2004-11-11
  • 打赏
  • 举报
回复
pigo 2004-11-10
  • 打赏
  • 举报
回复

你 是说这行吗???


([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\s-\s-\s[([^\]]+)\]

所有的\都要写成\\。java才认识.

正则表达式里]也需要转义,因此就要写成\],再加上java的转义,所以要写成\\].




umbrella1984 2004-11-10
  • 打赏
  • 举报
回复
Java正则表达式详解 这书有卖吗,给个地址,急切寻找。
frhwxx 2004-11-10
  • 打赏
  • 举报
回复
我上面把你说的情况已经都已经执行过了

java中的反斜杠我清楚。

就是第一个程序,你在看看他的提示错误,我感觉到有些莫名其妙!
pigo 2004-11-10
  • 打赏
  • 举报
回复

少了条反斜线转义:

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();
}

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧