Java之正则表达式

 
今天写东西碰到一个问题,与Java之正则表达式有关。
————————————————————————————
String tmpstr = "abcdiedfg";
if(tmpstr.matches("[^(img)]*"))
{
    System.out.println("yes,matched");
}
else
{
    System.out.println("no, not matched.");
}
————————————————————————————
上述代码检测,如果tmpstr中不含有img子串,则输出“yes”,否则输出"no".
显然"abcdiefg"中不含有“img”子串,可实际上我测上述代码得到的输出却是:
 
no,not matched.
 
这样的话,就可以理解成:
"[^(img)]"
等同于
"[^img]"
可是这两个正则表达式怎么会相同呢?
 
曾经在js中成功的实用过诸如
tmpstr.match(/(jpg|jpeg|png)/i);
可在Java中怎么就不行了呢?
 
深度怀疑并努力探寻之.
 
 
//——————————2005.09.24———————————-
 
今天在写另外一个java正则表达式:
匹配一个合法的email地址,
String mailformat = "^[^0-9]+[.0-9a-zA-Z_-]*@[0-9a-zA-Z_-]+[.0-9a-zA-Z_-]+.[a-zA-Z]{2,4}$" ;
 
email的格式和要求是:
1.不能以数字开始,如"1@abc.com"是不合法的;
2. 不能没有"@";
3. ”@“和”."之间不能没有任意字符,如“abc@.com”是不合法的
4. 只能含有0-9,a-z,A-Z,-,_字符,不可以含有其他字符
5.域名的最后一段至多4个,至少2个
 
根据这些可以定义上述正则表达式,
 
实际上上述表达式不能判断wadelau@gmail不是一个合法的表达式。
也即上述表达式在匹配email地址时有误。
 
因为"."是匹配除了换行符之外的任意字符,因此需要将"."进行转义,转义后:
 
String mailformat = "^[^0-9]+[\.0-9a-zA-Z_-]*@[0-9a-zA-Z_-]+[\.0-9a-zA-Z_-]+\.[a-zA-Z]{2,4}$" ;
 
写成如上,应该是可以的,但在实际编译运行中,会报错说此处的"\"是非法的引用符。
 
为何会这样?
 
将之改成:
String mailformat = "^[^0-9]+[\\.0-9a-zA-Z_-]*@[0-9a-zA-Z_-]+[\\.0-9a-zA-Z_-]+\\.[a-zA-Z]{2,4}$" ;
 
多加一个"\"即可,原来在编译时,"\"本身也需要转义。
 
 
 
 

//——————————2005.10.20———————————-
 
再次被java正则表达式所吸引。
 
今次遇到的问题是:
要将字符串
String targetstr = "abcd  efg
                             hijk  lmn";
分割到数组中并使用下标调用每个单元。
 
先进行第一步:
String[] first_arr = targetstr.split("\n");
因为有换行符在里面,所以先切成一行一行的,这一步没有问题,换行的正则表达式就是"\n".
 
接下来进行第二步,根据空格再切一次,引起每行里面有空格在,所以:
假定i为first_arr的下标,则
String[] second_arr = first_arr[i].split("  ");
 
运行不出来,明明有空格在里面怎么切不出来? 好像js中就是这样的。
后来想起,split后面是定要正则表达式的,而空格的正则表达式,显然不是" ",
 
又去学习了一遍Pattern的类:
Predefined character classes
.     Any character (may or may not match line terminators)
\d     A digit: [0-9]
\D     A non-digit: [^0-9]
\s     A whitespace character: [ \t\n\x0B\f\r]
\S     A non-whitespace character: [^\s]
\w     A word character: [a-zA-Z_0-9]
\W     A non-word character: [^\w]
 
找到一个"\s"似乎能够完成任务,于是拿来试一下:
 
String[] second_arr = first_arr[i].split("\s");
 
运行结果[在resin上]是,抱错,说小s前面的"\"是非法的引用符,不会吧,api手册上就是怎么说的,怎么会是非法的呢?而且在使用"\n"来用时也不会有错啊, 联想到在写mailformat正则表达式时,需要反引"\"时,决定改为:
 
String[] second_arr = first_arr[i].split("\\s");
 
ok,运行通过!
 
不过还真是奇怪,明明"\n","\t"用的很好,怎么换到"\s"上就要"\\s"呢?
 
法无定法?
 
 
 
此条目发表在计算机与 Internet分类目录。将固定链接加入收藏夹。

2 Responses to Java之正则表达式

  1. 说道:

    支持一下吧

  2. 说道:

    挨骂中也能得到进步,是一种享受,可以接受,多了也就不以为是了.

留下评论