最近看到一个有趣的问题,String str="abcd",如何使用正则得到str的所有字符,结果"a,b,c,d"。
不是很简单吗,上代码:
public static void errorMethodTest(String srcStr) {
String[] strArr = srcStr.split("");
for (String str : strArr) {
System.out.print(str + ",");
}
System.out.println();
}
结果为:
,a,b,c,d,
前面多了一个""。
如何正确的得到a,b,c,d呢?参考了博客http://www.coderanch.com/t/497299/java/java/Splitting-String-characters
正确方法为:
public static void strSplitMethodTest(String srcStr) {
String[] strArr = srcStr.split("(?<!^)");
for (String s : strArr) {
System.out.print(s + ",");
}
System.out.println();
}
或者
public static void strSplitMethod2Test(String srcStr) {
String[] strArr = srcStr.split("(?!^)");
for (String str : strArr) {
System.out.print(str + ",");
}
System.out.println();
}
上面的那玩意是什么呢?是正则表达式中的反向预查,正向预查,参考了博客http://my.oschina.net/lxpan/blog/27907
(?<=pattern) 反向匹配
(?<!pattern) 反向不匹配
(?=pattern) 正向匹配
(?!pattern) 正向不匹配
测试例子:
public static void myTest() {
String testStr = "foreach eachfor forall allfor alleach eachall";
Pattern p = Pattern.compile("(?<!for)each");// 匹配任何前面不带有for的each
Matcher match = p.matcher(testStr);
while (match.find()) {
System.out.println(match.group());
}
System.out.println("--------------------------------");
p = Pattern.compile("(?<=for)each");// 匹配任何前面带有for的each
match = p.matcher(testStr);
while (match.find()) {
System.out.println(match.group());
}
System.out.println("-------------------------------");
p = Pattern.compile("for(?!each)");// 会匹配任何后面不是each的for
match = p.matcher(testStr);
while (match.find()) {
System.out.println(match.group());
}
System.out.println("-------------------------------");
p = Pattern.compile("for(?=each)");// 会匹配任何后面是each的for
match = p.matcher(testStr);
while (match.find()) {
System.out.println(match.group());
}
}
结果为:
each
each
each
--------------------------------
each
-------------------------------
for
for
for
-------------------------------
for
上面的不够直观,使用RegexBuddy软件结果如下:
不使用正则怎么做呢?
public static void strMethodTest(String srcStr) {
char[] strArr = srcStr.toCharArray();
for (char c : strArr) {
System.out.print(c + ",");
}
System.out.println();
}
全文完。