先看下面的代码
String test="www.baidu.com";
String[] result=test.split(".");
System.out.println(Arrays.toString(result));
初一看,输出结果肯定是[www,baidu,com]
但是,实际上的输出结果却是[],Why?
仔细查看一下String的API说明就可以发现split(String regex),奥秘就在这里,split使用正则表达式作为参数,而"."在正则表达式中表示任意字符,因此最后没有任何结果也就可以相见了。
类似的String的API还有matches,replaceAll,replaceFirst。
在String的API中,还有一对很奇怪的API:replace和replaceAll,只从名字看,replaceAll是replace的复数形式,但实际上二者都是用于替换字符串中所有匹配的字符串,只不过replace用普通字符串作参数,而replaceAll用正则表达式作参数
//split使用的是正则表达式作为参数
String test="www.baidu.com";
String temp1=test.replace(".", "\\");//这里的\\是用于转义\符号
//第一个正则表达式参数中,\\.将会被转义成\.
//第二个实际上是前两个\\用于生成转义用的\,而后两条用于生成字符\
String temp2=test.replaceAll("\\.", "\\\\");
System.out.println("replace的结果:"+temp1);
System.out.println("replaceAll的结果:"+temp2);
上面的代码,temp1和temp2的值是相同的
在temp2的实现过程中为什么用了4个\而不是temp1的2个\呢,这是因为虽然replace、replaceAll在底层都是通过Matcher类的replaceAll函数实现的,但是replace在调用之前调用过toString,将转义过程提前了,而replaceAll实际上是在Matcher类实现replaceAll的过程中才进行转义字符的处理。在Matcher的实现中如下:第16行程序中,读到"\\"时,自动向下扫描,如果只有2个\,将会出现StringIndexOutOfBoundsException异常
public Matcher appendReplacement(StringBuffer sb, String replacement) {
// If no match, return error
if (first < 0)
throw new IllegalStateException("No match available");
// Process substitution string to replace group references with groups
int cursor = 0;
String s = replacement;
StringBuffer result = new StringBuffer();
while (cursor < replacement.length()) {
char nextChar = replacement.charAt(cursor);
if (nextChar == '\\') {
cursor++;
nextChar = replacement.charAt(cursor);
result.append(nextChar);
cursor++;
} else if (nextChar == '$') {
// Skip past $
cursor++;
// The first number is always a group
int refNum = (int)replacement.charAt(cursor) - '0';
if ((refNum < 0)||(refNum > 9))
throw new IllegalArgumentException(
"Illegal group reference");
cursor++;
// Capture the largest legal group string
boolean done = false;
while (!done) {
if (cursor >= replacement.length()) {
break;
}
int nextDigit = replacement.charAt(cursor) - '0';
if ((nextDigit < 0)||(nextDigit > 9)) { // not a number
break;
}
int newRefNum = (refNum * 10) + nextDigit;
if (groupCount() < newRefNum) {
done = true;
} else {
refNum = newRefNum;
cursor++;
}
}
// Append group
if (group(refNum) != null)
result.append(group(refNum));
} else {
result.append(nextChar);
cursor++;
}
}
分享到:
相关推荐
lua字符串转数组,类似js里的split()和php里的explode()
Java:分割字符串不能写成split(“$”)//$为要分割的字符 Android:分割字符串需要加上中括号split(“[$]”)//$为要分割的字符 2.特殊用法–当split()分割字符串遇上特殊符号 案例分析 String str = abc|dfg; ...
sqlserver中根据某个字符切割字符串函数,比如根据逗号切割字符串,结果返回的是一个表值函数,这个函数返回结果字段包含Id和Value,Id为序号,Value为切割后的值
NULL 博文链接:https://bijian1013.iteye.com/blog/2334967
pb split() pb 字符串分割函数 自己写的字符串分割函数
* 使用一个字符串分割另一个字符串 * * @param delimiter 边界上的分隔字符 * @param haystack 输入的字符串 * @param out 输出的字符串指针 * @return 分割成了多少个成员 */ int explode(char *delimiter, ...
这个方法用来处理java中可能有一些特别的需要,一大串中英文混合,需要中间截断或是中英中间添加一些特别的标识,调用这个方法 第一个参数是要处理的字符串,第二个是要在中英字符中间插入的字符。调用就可以得到想...
c语言实现字符串分割split(), 实现C语言实现按分隔符来截取字符串
主要介绍了js使用split函数按照多个字符对字符串进行分割的方法,实例分析了split函数的使用技巧,非常具有实用价值,需要的朋友可以参考下
本文详细介绍了vbscript中split函数的用法,有关split函数的一些实例,vbscript中split函数的语法介绍,有需要的朋友参考下
SQLServer数据库中创建字符串截取功能(Split),调用方法: Split(string,str)
delphi7分割字符串
SQL FUNCTION Split 字符串分割函数 的创建,方法加实例
C#中用Split计算英文字符串中单词个数[收集].pdf
主要记录在工作中,初识db2遇到的一些问题 db2字符串分隔,函数,过程的使用
主要介绍了SQL Server实现split函数分割字符串功能及用法,结合实例形式分析了SQL Server实现split分割字符串的相关技巧与使用方法,需要的朋友可以参考下
本文实例汇总了C++常用字符串分割方法,分享给大家供大家参考。具体分析如下: 我们在编程的时候经常会碰到字符串分割的问题,这里总结下,也方便我们以后查询使用。 一、用strtok函数进行字符串分割 原型: char *...
1. 字符串连接 2.字符串分隔, split 一个 string 的部分到一个内表或一系列的变量
用于分割字符串
这是我遇到的问题,然后发现pb里没有split方法,就自己写了一个,应该还能算是简单而实用吧