之前在http://shukuiyan.iteye.com/blog/507915文中已经叙述过这个问题,但是最近一次笔试中居然有碰到了这个知识点,而且还做错了,囧!学艺不精啊。题目大概是这样的:
- Strings2="thisisatest";
- Stringsarray[]=s2.split("/s");
- System.out.println("sarray.length="+sarray.length);
这个输出是什么还是编译出错?我想那个split方法中的参数要是"s"的话,输出一定是4了,就是将原来字符串分成了数组{"thi","i","a te","t"},但是原题split方法中的参数要是"/s",那么这个参数到底是嘛意思呢,实验后输出结果居然是1。
原因还得深究啊。
java.lang.string.split,即split 方法,它实现的功能是将一个字符串分割为子字符串,然后将结果作为字符串数组返回。 格式为:
stringObj.split([separator,[limit]]) 其中stringObj是必选项,表示要被分解的 String 对象或文字。该对象不会被 split 方法修改。 separator 为可选项,表示字符串或正则表达式对象,它标识了分隔字符串时使用的是一个还是多个字符。如果忽略该选项,返回包含整个字符串的单一元素数组。 limit 为可选项,该值用来限制返回数组中的元素个数。 值得注意的是: split 方法的结果是一个字符串数组,在 stingObj 中每个出现 separator 的位置都要进行分解,separator 不作为任何数组元素的部分返回。
一个例子
Stringsrcstring="thisisaaboutsplittest";
Stringstringarray[]=srcstring.split("");
for(Stringstemp:stringarray){
System.out.println(stemp);
}
Stringsrcstring1="thisisaaboutsplittest";
Stringstringarray1[]=srcstring1.split("");
for(Stringstemp:stringarray1){
}
这样输出结果为
this
is
a
about
split
test
另一个:
test
另外一个例子
Stringsrcstring="thisisaaboutsplittest";
Stringstringarray[]=srcstring.split("",2);
////在每个空格字符处进行分解
for(Stringstemp:stringarray){
System.out.println(stemp);
}
输出结果为
isaaboutsplittest
看看下面这个
Stringipstring="59.64.159.224";
Stringiparray[]=ipstring.split(".");
for(Stringstemp:iparray){
这个输出为空,为什么呢?
因为 public string[] split(string regex) 这里的参数的名称是regex ,也就是 regular expression (正则表达式)。这个参数并不是一个简单的分割用的字符,而是一个正则表达式,以下是split 方法的实现代码: public string[] split(string regex,int limit) { return pattern.compile(regex).split(this,limit); }
split 的实现直接调用的 matcher 类的 split 的方法。我们知道,“ . ”在正则表达式中有特殊的含义,因此我们使用的时候必须进行转义。 只要将
Stringiparray[]=ipstring.split(".");
改为
Stringiparray[]=ipstring.split(".");
就可以了。
那么这里在列上一些转义字符
反斜杠 t间隔('u0009') n换行('u000A') r回车('u000D') d数字等价于[0-9] D非数字等价于[^0-9] s空白符号[tnx0Bfr] S非空白符号[^tnx0Bfr] w单独字符[a-zA-Z_0-9] W非单独字符[^a-zA-Z_0-9] f换页符 e Escape b一个单词的边界 B一个非单词的边界 G前一个匹配的结束
为限制开头 ^java 条件限制为以Java为开头字符 $为限制结尾 java$ 条件限制为以java为结尾字符 .条件限制除n以外任意一个单独字符 java.. 条件限制为java后除换行外任意两个字符
加入特定限制条件「[]」 [a-z] 条件限制在小写a to z范围中一个字符 [A-Z] 条件限制在大写A to Z范围中一个字符 [a-zA-Z]条件限制在小写a to z或大写A to Z范围中一个字符 [0-9] 条件限制在小写0 to 9范围中一个字符 [0-9a-z]条件限制在小写0 to 9或a to z范围中一个字符 [0-9[a-z]]条件限制在小写0 to 9或a to z范围中一个字符(交集) []中加入^后加再次限制条件「[^]」 [^a-z] 条件限制在非小写a to z范围中一个字符 [^A-Z] 条件限制在非大写A to Z范围中一个字符 [^a-zA-Z]条件限制在非小写a to z或大写A to Z范围中一个字符 [^0-9] 条件限制在非小写0 to 9范围中一个字符 [^0-9a-z]条件限制在非小写0 to 9或a to z范围中一个字符 [^0-9[a-z]]条件限制在非小写0 to 9或a to z范围中一个字符(交集)
在限制条件为特定字符出现0次以上时,可以使用「*」 J* 0个以上J .* 0个以上任意字符 J.*D J与D之间0个以上任意字符 在限制条件为特定字符出现1次以上时,可以使用「+」 J+ 1个以上J .+ 1个以上任意字符 J.+D J与D之间1个以上任意字符 在限制条件为特定字符出现有0或1次以上时,可以使用「?」 JA? J或者JA出现
限制为连续出现指定次数字符「{a}」 J{2} JJ J{3} JJJ 文字a个以上,并且「{a,}」 J{3,} JJJ,JJJJ,JJJJJ,???(3次以上J并存) 文字个以上,b个以下「{a,b}」 J{3,5} JJJ或JJJJ或JJJJJ 两者取一「|」 J|A J或A Java|Hello Java或Hello
「()」中规定一个组合类型 比如,我查询<a href="index.html">index</a>中<a href></a>间的数据,可写作<a.*href=".*">(.+?)</a>
◆比如,在字符串包含验证时 //查找以Java开头,任意结尾的字符串 Pattern pattern = Pattern.compile("^Java.*"); Matcher matcher = pattern.matcher("Java不是人"); boolean b= matcher.matches(); //当条件满足时,将返回true,否则返回false System.out.println(b); 以多条件分割字符串时 Pattern pattern = Pattern.compile("[,|]+"); String[] strs = pattern.split("Java Hello World Java,Hello,World|Sun"); for (int i=0;i<strs.length;i++) { System.out.println(strs[i]); } 文字替换(首次出现字符) Pattern pattern = Pattern.compile("正则表达式"); Matcher matcher = pattern.matcher("Hello World,sans-serif; font-size:14px; line-height:25.1875px">Hello World"); //替换第一个符合正则的数据 System.out.println(matcher.replaceFirst("Java")); 文字替换(全部) System.out.println(matcher.replaceAll("Java")); 文字替换(置换字符)Hello World "); StringBuffer sbr = new StringBuffer(); while (matcher.find()) { matcher.appendReplacement(sbr,"Java"); } matcher.appendTail(sbr); System.out.println(sbr.toString()); 验证是否为邮箱地址 String str="ceponline@yahoo.com.cn"; Pattern pattern = Pattern.compile("[w.-]+@([w-]+.)+[w-]+",Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(str); System.out.println(matcher.matches()); 去除html标记 Pattern pattern = Pattern.compile("<.+?>",Pattern.DOTALL); Matcher matcher = pattern.matcher("<a href="index.html">主页</a>"); String string = matcher.replaceAll(""); System.out.println(string); 查找中对应条件字符串 Pattern pattern = Pattern.compile("href="(.+?)""); Matcher matcher = pattern.matcher("<a href="index.html"></a>"); if(matcher.find()) System.out.println(matcher.group(1)); } 截取http://地址 //url Pattern pattern = Pattern.compile("(http://|https://){1}[w.-/:]+"); Matcher matcher = pattern.matcher("dsdsds<http://dsds//gfgffdfd>fdf"); StringBuffer buffer = new StringBuffer(); while(matcher.find()){ buffer.append(matcher.group()); buffer.append("rn"); System.out.println(buffer.toString()); } 替换指定{}中文字 String str = "Java目前的发展史是由{0}年-{1}"; String[][] object={new String[]{"{0}","1995"},new String[]{"{1}","2007"}}; System.out.println(replace(str,object)); public static String replace(final String sourceString,Object[] object) { String temp=sourceString; for(int i=0;i<object.length;i++){ String[] result=(String[])object[i]; Pattern pattern = Pattern.compile(result[0]); Matcher matcher = pattern.matcher(temp); temp=matcher.replaceAll(result[1]); } return temp; } 以正则条件查询指定目录下文件用于缓存文件列表 private ArrayList files = new ArrayList(); //用于承载文件路径 private String _path; //用于承载未合并的正则公式 private String _regexp; class MyFileFilter implements FileFilter { /** *匹配文件名称 */ public boolean accept(File file) { try { Pattern pattern = Pattern.compile(_regexp); Matcher match = pattern.matcher(file.getName()); return match.matches(); } catch (Exception e) { return true; } } } /** *解析输入流 * @param inpu
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|