今天写东西碰到一个问题,与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"呢?
法无定法?
支持一下吧
挨骂中也能得到进步,是一种享受,可以接受,多了也就不以为是了.