java.lang.String中的trim()…
2013-08-01 19:34
190 查看
String.Trim()方法到底为我们做了什么,仅仅是去除字符串两端的空格吗?
一直以为Trim()方法就是把字符串两端的空格字符给删去,其实我错了,而且错的比较离谱。
首先我直接反编译String类,找到Trim()方法:
public string Trim() { return
this.TrimHelper(WhitespaceChars, 2); }
TrimHelper方法有两个参数,第一个参数名WhitespaceChars,首字母尽然是大写的,肯定有文章,真不出我所料:
internal static readonly char[]
WhitespaceChars;
这里只是定义它,没有赋值,而且是静态的,我们看看构造函数去,果然找到:
static String()
{ Empty = " "; WhitespaceChars =
new char[] { '/t', '/n', '/v', '/f', '/r', ' ', '/x0085', '/x00a0',
'?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?',
'/u2028', '/u2029', ' ', '?' }; }
Trim方法就是把字符串两端的这些字符给删去?我很坚定的猜想到。
继续我们的探索,直接反编译TrimHelper,哇,也许这个才是我想要的,私有的TrimHelper方法:
private string TrimHelper(char[]
trimChars, int trimType)
{
int num = this.Length - 1;
intstartIndex = 0;
if (trimType != 1) {
startIndex =
0; while (startIndex <<SPAN
style="LINE-HEIGHT: 21px; WORD-WRAP: normal; WORD-BREAK:
normal"> this.Length) { int index = 0; char ch =
this[startIndex]; index = 0; while (index <
trimChars.Length) { if (trimChars[index] == ch) { break; } index++;
} if (index == trimChars.Length) { break; } startIndex++; } }
if(trimType != 0) { num = this.Length - 1; while (num
>= startIndex) { int num4 = 0; char ch2 =this[num];
num4 = 0; while (num4 < trimChars.Length) { if
(trimChars[num4] == ch2) { break; } num4++; } if (num4 ==
trimChars.Length) { break; } num--; } } int length = (num -
startIndex) + 1;if (length == this.Length) { return this; } if
(length == 0) { return Empty; }
returnthis.InternalSubString(startIndex, length, false);
}
经过分析和运行,基本上知道了这个方法是干什么的了。
TrimHelper方法有两个参数:
第一个参数trimChars,是要从字符串两端删除掉的字符的数组;
第二个参数trimType,是标识Trim的类型。就目前发现,trimType的取值有3个。当传入0时,去除字符串头部的空白字符,传入1时去除字符串尾部的空白字符,传入其他数值(比如2)
去除字符串两端的空白字符。
最后再看看真正执行字符串截取的方法:
private unsafe string
InternalSubString(int startIndex, int length, bool fAlwaysCopy) {
if(((startIndex == 0) && (length ==
this.Length)) && !fAlwaysCopy) {
return this; } string str = FastAllocateString(length); fixed
(char* chRef = &str.m_firstChar) { fixed (char*
chRef2 = &this.m_firstChar) { wstrcpy(chRef, chRef2
+ startIndex, length); } } return str; }
原来也用指针的?第一次看到,效率应该比较高吧。
最后总结一下:
String.Trim()方法会去除字符串两端,不仅仅是空格字符,它总共能去除25种字符:
('/t', '/n', '/v', '/f', '/r', ' ', '/x0085', '/x00a0', ' ', ' ', '
', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '?', '/u2028',
'/u2029', ' ', '?')
如果你想保留其中的一个或多个(例如/t制表符,/n换行符,/r回车符等),请慎用Trim方法。
请注意,Trim删除的过程为从外到内,直到碰到一个非空白的字符为止,所以不管前后有多少个连续的空白字符都会被删除掉。
最后附上两个相关的方法(也是String类直接提供的),分别去除字符串头部空白字符的TrimStart方法和去除字符串尾部空白字符的
TrimEnd方法:
TrimStart和TrimEnd方法
如果想去除字符串两端其他任意字符,可以考虑Trim他的重载兄弟:String.Trim(Char[]),传入你想要去除的哪些字符的数组。
源码奉上:
public string Trim(params char[]
trimChars) { if ((trimChars == null) || (trimChars.Length == 0)) {
trimChars = WhitespaceChars; } return this.TrimHelper(trimChars,
2); }
空格 != 空白字符,删除空格请使用: Trim(‘
‘);
待验证: ------
新浪网友2011-12-12 10:32:21[回复] [删除]
[举报]
strim() 源码:
public String trim() {
1737
int start = offset, last = offset + count - 1;
1738
int end = last;
1739
while ((start <= end)
&& (value[start] <=
' ')) {
1740
start++;
1741
}
1742
while ((end >= start)
&& (value[end] <= '
')) {
1743
end--;
1744
}
1745
if (start == offset && end == last)
{
1746
return this;
1747
}
1748
return new String(start, end - start + 1, value);
1749
}
就是去除两头的空格,不知道你的源码从何而来。
一直以为Trim()方法就是把字符串两端的空格字符给删去,其实我错了,而且错的比较离谱。
首先我直接反编译String类,找到Trim()方法:
public string Trim() { return
this.TrimHelper(WhitespaceChars, 2); }
TrimHelper方法有两个参数,第一个参数名WhitespaceChars,首字母尽然是大写的,肯定有文章,真不出我所料:
internal static readonly char[]
WhitespaceChars;
这里只是定义它,没有赋值,而且是静态的,我们看看构造函数去,果然找到:
static String()
{ Empty = " "; WhitespaceChars =
new char[] { '/t', '/n', '/v', '/f', '/r', ' ', '/x0085', '/x00a0',
'?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?',
'/u2028', '/u2029', ' ', '?' }; }
Trim方法就是把字符串两端的这些字符给删去?我很坚定的猜想到。
继续我们的探索,直接反编译TrimHelper,哇,也许这个才是我想要的,私有的TrimHelper方法:
private string TrimHelper(char[]
trimChars, int trimType)
{
int num = this.Length - 1;
intstartIndex = 0;
if (trimType != 1) {
startIndex =
0; while (startIndex <<SPAN
style="LINE-HEIGHT: 21px; WORD-WRAP: normal; WORD-BREAK:
normal"> this.Length) { int index = 0; char ch =
this[startIndex]; index = 0; while (index <
trimChars.Length) { if (trimChars[index] == ch) { break; } index++;
} if (index == trimChars.Length) { break; } startIndex++; } }
if(trimType != 0) { num = this.Length - 1; while (num
>= startIndex) { int num4 = 0; char ch2 =this[num];
num4 = 0; while (num4 < trimChars.Length) { if
(trimChars[num4] == ch2) { break; } num4++; } if (num4 ==
trimChars.Length) { break; } num--; } } int length = (num -
startIndex) + 1;if (length == this.Length) { return this; } if
(length == 0) { return Empty; }
returnthis.InternalSubString(startIndex, length, false);
}
经过分析和运行,基本上知道了这个方法是干什么的了。
TrimHelper方法有两个参数:
第一个参数trimChars,是要从字符串两端删除掉的字符的数组;
第二个参数trimType,是标识Trim的类型。就目前发现,trimType的取值有3个。当传入0时,去除字符串头部的空白字符,传入1时去除字符串尾部的空白字符,传入其他数值(比如2)
去除字符串两端的空白字符。
最后再看看真正执行字符串截取的方法:
private unsafe string
InternalSubString(int startIndex, int length, bool fAlwaysCopy) {
if(((startIndex == 0) && (length ==
this.Length)) && !fAlwaysCopy) {
return this; } string str = FastAllocateString(length); fixed
(char* chRef = &str.m_firstChar) { fixed (char*
chRef2 = &this.m_firstChar) { wstrcpy(chRef, chRef2
+ startIndex, length); } } return str; }
原来也用指针的?第一次看到,效率应该比较高吧。
最后总结一下:
String.Trim()方法会去除字符串两端,不仅仅是空格字符,它总共能去除25种字符:
('/t', '/n', '/v', '/f', '/r', ' ', '/x0085', '/x00a0', ' ', ' ', '
', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '?', '/u2028',
'/u2029', ' ', '?')
如果你想保留其中的一个或多个(例如/t制表符,/n换行符,/r回车符等),请慎用Trim方法。
请注意,Trim删除的过程为从外到内,直到碰到一个非空白的字符为止,所以不管前后有多少个连续的空白字符都会被删除掉。
最后附上两个相关的方法(也是String类直接提供的),分别去除字符串头部空白字符的TrimStart方法和去除字符串尾部空白字符的
TrimEnd方法:
TrimStart和TrimEnd方法
如果想去除字符串两端其他任意字符,可以考虑Trim他的重载兄弟:String.Trim(Char[]),传入你想要去除的哪些字符的数组。
源码奉上:
public string Trim(params char[]
trimChars) { if ((trimChars == null) || (trimChars.Length == 0)) {
trimChars = WhitespaceChars; } return this.TrimHelper(trimChars,
2); }
空格 != 空白字符,删除空格请使用: Trim(‘
‘);
待验证: ------
新浪网友2011-12-12 10:32:21[回复] [删除]
[举报]
strim() 源码:
public String trim() {
1737
int start = offset, last = offset + count - 1;
1738
int end = last;
1739
while ((start <= end)
&& (value[start] <=
' ')) {
1740
start++;
1741
}
1742
while ((end >= start)
&& (value[end] <= '
')) {
1743
end--;
1744
}
1745
if (start == offset && end == last)
{
1746
return this;
1747
}
1748
return new String(start, end - start + 1, value);
1749
}
就是去除两头的空格,不知道你的源码从何而来。
相关文章推荐
- java.lang.String中的trim()方法的详细说明
- java.lang.String中的trim()方法的详细说明
- java.lang.String中的trim()方法的详细说明
- java.lang.String中的trim()方法的详细说明
- java.lang.String中的trim()方法的详细说明
- java.lang.String中的trim()方法的详细说明
- java.lang.String中的trim()…
- java.lang.String中的trim()方法的详细说明
- java.lang.String.trim(), 不仅仅去掉空格
- java.lang.String中的trim()方法的详细说明
- java.lang.String中的trim()方法的详细说明
- java.lang.String中的trim()方法的详细说明(转)
- java.lang.String.trim()函数的使用
- java.lang.String中的trim()方法的详细说明
- Java笔记之java.lang.String#trim
- java.lang.String的trim()的用法
- java.lang.String中的trim()方法的详细说明
- java.lang.String中的trim()方法的详细说明
- java.lang.string.split 函数使用
- There is no getter for property named '*' in 'class java.lang.String