js中截取字符串的三个方法 substring()、substr()、slice()、C#截取字符串的方法

JS

js中有三个截取字符的方法,分别是substring()substr()slice(),平时我们可能都用到过,但总是会对这些方法有点混淆,特别是substring()substr(),连方法名都差不多,下面就具体来看一下区别。

相同点

这三个方法都可以对字符串进行截取,并且返回一个新的字符串,也就是不会对原字符串进行修改。

//chrome控制台
> var a = '0123456789'
< undefined
> a.substr(1,5)
< "12345"
> a
< "0123456789"  //没有发生改变

不同点

这三个方法的不同之处在于参数不同。

一、substring

substring() 方法用于提取字符串中介于两个指定下标之间的字符。

语法

string.substring(start,stop);

参数

参数描述
start必需。一个非负的整数,规定要提取的子串的第一个字符在 string 中的位置。
stop可选。一个非负的整数,比要提取的子串的最后一个字符在 string 中的位置多 1。如果省略该参数,那么返回的子串会一直到字符串的结尾。

说明

1.substring() 方法返回的子串包括 start 处的字符,但不包括 stop 处的字符。

//chrome控制台
> var a = '0123456789'
< undefined
> a.substring(1,5)
< "1234"

2.如果参数 start 与 stop 相等,那么该方法返回的就是一个空串(即长度为 0 的字符串)。

//chrome控制台
> var a = '0123456789'
< undefined
> a.substring(1,1)
< ""

3.如果 start 比 stop 大,那么该方法在提取子串之前会先交换这两个参数。

//chrome控制台
> var a = '0123456789'
< undefined
> a.substring(5,1) //=>a.substring(1,5)
< "1234"

4.如果 start 和 stop 有负数,那么会把该参数自动转为0,然后继续上述规则。

//chrome控制台
> var a = '0123456789'
< undefined
> a.substring(5,-1) //=>a.substring(5,0) => a.substring(0,5)
< "1234"

5.如果 start 和 stop 有正小数(负数直接进行第4条),那么会把该参数向下取整,然后继续上述规则。

//chrome控制台
> var a = '0123456789'
< undefined
> a.substring(5,2.5) //=>a.substring(5,2) => a.substring(2,5)
< "234"

6.如果 start 和 stop 有字符串,那么会先进行parseInt(),如果转换结果为NaN,那么就转换为0,其余情况继续上述规则。

//chrome控制台
> var a = '0123456789'
< undefined
> a.substring(5,'2.5') // =>a.substring(5,2) => a.substring(2,5)
< "234"
> a.substring(5,'ss') // =>a.substring(5,2) =>a.substring(5,0) => a.substring(2,5)
< "234"

其他情况就没有一一测试了,当然正常情况下尽量不要这么干,毕竟语法上已经规定了是整数。

二、substr

substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符。

语法

string.substr(start,length)
重要事项:ECMAscript 没有对该方法进行标准化,因此反对使用它。

参数

参数描述
start必需。要抽取的子串的起始下标。必须是数值。如果是负数,那么该参数声明从字符串的尾部开始算起的位置。也就是说,-1 指字符串中最后一个字符,-2 指倒数第二个字符,以此类推。
length可选。子串中的字符数。必须是数值。如果省略了该参数,那么返回从 string 的开始位置到结尾的字串。

说明

该方法与substring()最大的区别在于第二个参数是你需要截取字符串的长度,而不是位置。

1.substr() 方法返回的子串从 start 处的字符开始(包括)往后截取length长度,如果超过最末端就到最末端结束。

//chrome控制台
> var a = '0123456789'
< undefined
> a.substr(1,5)
< "12345"
> a.substr(1,15) //只会到最末端,多了没用
< "123456789"

2.start可以取负值,表示从字符串尾部往头部开始数(从右到左,注意是从1开始,比如-1 指字符串中最后一个字符),但是截取长度还是从左到右,如果超过最末端就到最末端结束。

//chrome控制台
> var a = '0123456789'
< undefined
> a.substr(-4,2) //-4表示从右开始数第4个,就是'6',然后取2个长度的字符串,就是'67'
< "67"

3.如果length负值,那么会直接当成0处理,最终返回""

//chrome控制台
> var a = '0123456789'
< undefined
> a.substr(4,-2) // => a.substr(4,0)
< ""

4.如果start或者length为小数,那么会截取小数部分。

//chrome控制台
> var a = '0123456789'
< undefined
> a.substr(1.2,5.2) // => a.substr(1,5)
< "12345"

5.如果 start 和 length 有字符串,那么会先进行parseInt(),如果转换结果为NaN,那么就转换为0,其余情况继续上述规则。

//chrome控制台
> var a = '0123456789'
< undefined
> a.substr('aa','5') // => a.substr(0,5)
< "01234"

三、slice

slice() 方法可提取字符串的某个部分,并以新的字符串返回被提取的部分。

语法

string.slice(start,end)

参数

参数描述
start必须。要抽取的片断的起始下标。如果是负数,则该参数规定的是从字符串的尾部开始算起的位置。也就是说,-1 指字符串的最后一个字符,-2 指倒数第二个字符,以此类推。
end可选。紧接着要抽取的片段的结尾的下标。若未指定此参数,则要提取的子串包括 start 到原字符串结尾的字符串。如果该参数是负数,那么它规定的是从字符串的尾部开始算起的位置。

该方法的两个参数均为位置坐标,和subtring比较像,区别就是该方法支持负数,并且不会交换位置,始终是从startend,如果该区间不存在,那么返回''

1.slice() 方法返回的子串包括 start 处的字符,但不包括 end 处的字符。

//chrome控制台
> var a = '0123456789'
< undefined
> a.slice(1,5)
< "1234"

2.当start或者end负值时,定位方式和substr一直,从右往左数,从1开始。

//chrome控制台
> var a = '0123456789'
< undefined
> a.slice(1,-1)//起始点从第1(包括)开始,结束点为从右往左数第1个(不包括)
< "12345678"

2.startend的顺序始终是从左到右,如果最终start的位置在end的右边,那么返回''

//chrome控制台
> var a = '0123456789'
< undefined
> a.slice(2,1)//2所在的位置是'2',1所在的位置是'1',从2=>1,方向相反,返回为空
< ""
> a.slice(-2,1)//-2所在的位置是'8',1所在的位置是'1',从8=>1,方向相反,返回为空
< ""
> a.slice(-2,-1)//-2所在的位置是'8',-1所在的位置是'9',从8=>9,方向正常,返回为'8'
< "8"

3.其他情况和substring处理方式一致

//chrome控制台
> var a = '0123456789'
< undefined
> a.slice('xx','5.5')// => a.slice(0,5)
< "01234"

小节

从上面测试得出结论,substring不支持负值,其他两种方式均支持负数表示,并且是从右边第一位开始计数。
substr的第二个参数是长度,这是和其他两种方式最大的不同之处,slice的方向性比较强,永远是从start=>end对应左=>右

以上结论均在最新谷歌浏览器上测试,IE和火狐未测试。

C#

1、单个字符分隔用split截取

string str = "GT123_1";
string[] strArray = str.Split('_');
//输出:sArray[0]="GT123"
//     sArray[1]="1"

2、利用多个字符来分隔字符串

string str = "GTAZB_JiangjBen_123";
string[] strArray = str.Split(new char[2] { 'j', '_' });
//输出:sArray[0]="GTAZB"
//     sArray[1]="Jiang"
//     sArray[2]="Ben"
//     sArray[3]="123"

3、根据字符串或字符串组来截取字符串

string str = "GTAZB_JiangjBen_123";
string[] strArray = str.Split(new string[] { "Ji", "jB" }, StringSplitOptions.RemoveEmptyEntries);
//输出:sArray[0]="GTAZB_"
//     sArray[1]="ang"
//     sArray[2]="en_123"。

4、提取字符串中的第i个字符开始的长度为j的字符串

string str = "GTAZB_JiangjBen_123";
int start = 3, length = 8; 
Console.WriteLine(str.Substring(start - 1, length));
//输出:AZB_Jian。

5、提取字符串中右数长度为i的字符串

string str = "GTAZB_JiangjBen_123";
int i = 5;
str = str.Substring(str.Length - i);
Console.WriteLine(str);
//输出:n_123。

6、替换字符串中的特定字符串

string str = "GTAZB_JiangjBen_123";
str = str.Replace("123", "321");
Console.WriteLine(str);
//输出:GTAZB_JiangjBen_321。

7、删除字符串中的特定字符串Jiangj

string str = "GTAZB_JiangjBen_123";
str = str.Replace("Jiangj", "");
Console.WriteLine(str);
//输出:GTAZB_Ben_123。

8、删除指定位置(第i个)的指定长度(length)的字符串

string str = "GTAZB_JiangjBen_123";
int i = 5, length = 8;
str = str.Remove(i, length);
Console.WriteLine(str);
//输出:GTAZBen_123。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
private final CharSequence getSmallTime() { Context context = getContext(); boolean is24 = DateFormat.is24HourFormat(context); LocaleData d = LocaleData.get(context.getResources().getConfiguration().locale); final char MAGIC1 = '\uEF00'; final char MAGIC2 = '\uEF01'; SimpleDateFormat sdf; String format = is24 ? d.timeFormat24 : d.timeFormat12; if (!format.equals(mClockFormatString)) { /* * Search for an unquoted "a" in the format string, so we can * add dummy characters around it to let us find it again after * formatting and change its size. */ if (AM_PM_STYLE != AM_PM_STYLE_NORMAL) { int a = -1; boolean quoted = false; for (int i = 0; i < format.length(); i++) { char c = format.charAt(i); if (c == ''') { quoted = !quoted; } if (!quoted && c == 'a') { a = i; break; } } if (a >= 0) { // Move a back so any whitespace before AM/PM is also in the alternate size. final int b = a; while (a > 0 && Character.isWhitespace(format.charAt(a-1))) { a--; } format = format.substring(0, a) + MAGIC1 + format.substring(a, b) + "a" + MAGIC2 + format.substring(b + 1); } } mClockFormat = sdf = new SimpleDateFormat(format); mClockFormatString = format; } else { sdf = mClockFormat; } String result = sdf.format(mCalendar.getTime()); if (AM_PM_STYLE != AM_PM_STYLE_NORMAL) { int magic1 = result.indexOf(MAGIC1); int magic2 = result.indexOf(MAGIC2); if (magic1 >= 0 && magic2 > magic1) { SpannableStringBuilder formatted = new SpannableStringBuilder(result); if (AM_PM_STYLE == AM_PM_STYLE_GONE) { formatted.delete(magic1, magic2+1); } else { if (AM_PM_STYLE == AM_PM_STYLE_SMALL) { CharacterStyle style = new RelativeSizeSpan(0.7f); formatted.setSpan(style, magic1, magic2, Spannable.SPAN_EXCLUSIVE_INCLUSIVE); } formatted.delete(magic2, magic2 + 1); formatted.delete(magic1, magic1 + 1); } return formatted; } } return result; }添加秒
06-08
你的问题是如何在这段代码添加秒? 这段代码的作用是获取当前时间并以指定格式显示出来,但没有显示秒数。要添加秒数,可以修改格式字符串。在这里,我们可以在格式字符串的末尾添加一个”:ss“,表示显示秒数。修改后的代码如下: ``` private final CharSequence getSmallTime() { Context context = getContext(); boolean is24 = DateFormat.is24HourFormat(context); LocaleData d = LocaleData.get(context.getResources().getConfiguration().locale); final char MAGIC1 = '\uEF00'; final char MAGIC2 = '\uEF01'; SimpleDateFormat sdf; String format = is24 ? d.timeFormat24 : d.timeFormat12; // Add seconds to the format string format += ":ss"; if (!format.equals(mClockFormatString)) { /* * Search for an unquoted "a" in the format string, so we can * add dummy characters around it to let us find it again after * formatting and change its size. */ if (AM_PM_STYLE != AM_PM_STYLE_NORMAL) { int a = -1; boolean quoted = false; for (int i = 0; i < format.length(); i++) { char c = format.charAt(i); if (c == '\'') { quoted = !quoted; } if (!quoted && c == 'a') { a = i; break; } } if (a >= 0) { // Move a back so any whitespace before AM/PM is also in the alternate size. final int b = a; while (a > 0 && Character.isWhitespace(format.charAt(a-1))) { a--; } format = format.substring(0, a) + MAGIC1 + format.substring(a, b) + "a" + MAGIC2 + format.substring(b + 1); } } mClockFormat = sdf = new SimpleDateFormat(format); mClockFormatString = format; } else { sdf = mClockFormat; } String result = sdf.format(mCalendar.getTime()); if (AM_PM_STYLE != AM_PM_STYLE_NORMAL) { int magic1 = result.indexOf(MAGIC1); int magic2 = result.indexOf(MAGIC2); if (magic1 >= 0 && magic2 > magic1) { SpannableStringBuilder formatted = new SpannableStringBuilder(result); if (AM_PM_STYLE == AM_PM_STYLE_GONE) { formatted.delete(magic1, magic2+1); } else { if (AM_PM_STYLE == AM_PM_STYLE_SMALL) { CharacterStyle style = new RelativeSizeSpan(0.7f); formatted.setSpan(style, magic1, magic2, Spannable.SPAN_EXCLUSIVE_INCLUSIVE); } formatted.delete(magic2, magic2 + 1); formatted.delete(magic1, magic1 + 1); } return formatted; } } return result; } ``` 在修改后的代码,我们在格式字符串的末尾添加了一个冒号和“ss”,表示显示秒数。然后,我们将修改后的格式字符串传递给SimpleDateFormat对象,以便格式化当前时间。最后,我们返回格式化后的时间字符串,它包含了秒数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值