同事给我出一题,如下:
问我输出什么
我不知道
而且第一次知道split原来可以用正则,
而且第一次知道还有printf这个……感觉这么用不太好,但是,真得长见识了
-----------------------------------------------------------
运行一下,输出如下:
strs[0] = one
strs[1] = 123
查看一下split方法,是支持正则的
那regex显然是个正则了,但是没用过这种
查文档,发现这就是传说中的零宽断言(看正则的时候见到过,但是从来没用过)
------------------------------------------------------------
[color=red][size=medium]介绍一下零宽断言:[/size][/color]
普通的正则表达式如\d(匹配数字)、\s(匹配空白符),都是一个或者多个字符。零宽断言比较特殊,他不匹配任何字符,而是匹配位置。也就是说它们像\b,^,$那样用于指定一个位置。
画个图表示一下(?<=las)表示的是las后面的位置,即箭头处,s和g之间的位置。
[img]http://dl.iteye.com/upload/attachment/239675/c43a0bad-70a0-3ef9-ab54-ede29e111e0b.jpg[/img]
零宽断言有4种:
[list=1]
[*](?=exp)匹配exp前面的位置
[*](?<=exp)匹配exp后面的位置
[*](?!exp)匹配后面不是exp的位置
[*](?<!exp)匹配前面不是exp的位置
[/list]
我这里说的不是很详细,如果有不明白的地方,可以参考下列网址:
[url=http://deerchao.net/tutorials/regex/regex.htm#lookaround]正则表达式30分钟入门[/url]
[url=http://blog.csdn.net/panhf2003/archive/2008/11/19/3337163.aspx]正则表达式——零宽断言[/url]
[url=http://blog.csdn.net/wangchinaking/archive/2007/08/21/1752734.aspx]正则表达式——零宽断言[/url]
------------------------------------------------------------
补充了上面的知识之后,我们的问题也就差不多了
(?<=one)和(?=123)实际上都是匹配one和123之间的那个位置,split这个位置,也就是从中间这个位置分隔,得到one和123就没问题了
先不考虑同时(?<=one)和(?=123)的问题,把regex换成(?<=one)或(?=123),应该也是可以的,经测试确实是可以的。
那么写两个没问题么?从结果上看确实是没有问题的。具体原因,还在探索中,我猜想毕竟是位置,一个多个可能无所谓,试了一下,写成这种“(?<=one)(?<=ne)(?=1)(?=123)”都是没问题的,也就是说位置是可以写重复的,原因我再查查文档,查到的话再贴过来,有路过的大虾顺便留个言。
public static void main(String[] args) {
String str = "one123";
String regex = "(?<=one)(?=123)";
String[] strs = str.split(regex);
for (int i = 0; i < strs.length; i++) {
System.out.printf("strs[%d] = %s%n", i, strs[i]);
}
}
问我输出什么
我不知道
而且第一次知道split原来可以用正则,
而且第一次知道还有printf这个……感觉这么用不太好,但是,真得长见识了
-----------------------------------------------------------
运行一下,输出如下:
strs[0] = one
strs[1] = 123
查看一下split方法,是支持正则的
那regex显然是个正则了,但是没用过这种
查文档,发现这就是传说中的零宽断言(看正则的时候见到过,但是从来没用过)
------------------------------------------------------------
[color=red][size=medium]介绍一下零宽断言:[/size][/color]
普通的正则表达式如\d(匹配数字)、\s(匹配空白符),都是一个或者多个字符。零宽断言比较特殊,他不匹配任何字符,而是匹配位置。也就是说它们像\b,^,$那样用于指定一个位置。
画个图表示一下(?<=las)表示的是las后面的位置,即箭头处,s和g之间的位置。
[img]http://dl.iteye.com/upload/attachment/239675/c43a0bad-70a0-3ef9-ab54-ede29e111e0b.jpg[/img]
零宽断言有4种:
[list=1]
[*](?=exp)匹配exp前面的位置
[*](?<=exp)匹配exp后面的位置
[*](?!exp)匹配后面不是exp的位置
[*](?<!exp)匹配前面不是exp的位置
[/list]
我这里说的不是很详细,如果有不明白的地方,可以参考下列网址:
[url=http://deerchao.net/tutorials/regex/regex.htm#lookaround]正则表达式30分钟入门[/url]
[url=http://blog.csdn.net/panhf2003/archive/2008/11/19/3337163.aspx]正则表达式——零宽断言[/url]
[url=http://blog.csdn.net/wangchinaking/archive/2007/08/21/1752734.aspx]正则表达式——零宽断言[/url]
------------------------------------------------------------
补充了上面的知识之后,我们的问题也就差不多了
(?<=one)和(?=123)实际上都是匹配one和123之间的那个位置,split这个位置,也就是从中间这个位置分隔,得到one和123就没问题了
先不考虑同时(?<=one)和(?=123)的问题,把regex换成(?<=one)或(?=123),应该也是可以的,经测试确实是可以的。
那么写两个没问题么?从结果上看确实是没有问题的。具体原因,还在探索中,我猜想毕竟是位置,一个多个可能无所谓,试了一下,写成这种“(?<=one)(?<=ne)(?=1)(?=123)”都是没问题的,也就是说位置是可以写重复的,原因我再查查文档,查到的话再贴过来,有路过的大虾顺便留个言。