提问人:Phill Pafford 提问时间:6/5/2009 最后编辑:LiamPhill Pafford 更新时间:1/30/2022 访问量:2395454
如何使用 Javascript 砍掉/切片/修剪字符串中的最后一个字符?
How do I chop/slice/trim off last character in string using Javascript?
答:
您可以使用子字符串函数:
let str = "12345.00";
str = str.substring(0, str.length - 1);
console.log(str);
这是公认的答案,但根据下面的对话,切片语法要清晰得多:
let str = "12345.00";
str = str.slice(0, -1);
console.log(str);
评论
str = str.substring(0, str.length -1);
slice
substring
slice()
substring
out-of-bound
怎么样:
let myString = "12345.00";
console.log(myString.substring(0, myString.length - 1));
对于像您的示例这样的数字,我建议您这样做:substring
console.log(parseFloat('12345.00').toFixed(1));
请注意,这实际上会使数字四舍五入,不过,我认为这是需要的,但可能不是:
console.log(parseFloat('12345.46').toFixed(1));
评论
如果要对浮点数进行通用舍入,而不仅仅是修剪最后一个字符:
var float1 = 12345.00,
float2 = 12345.4567,
float3 = 12345.982;
var MoreMath = {
/**
* Rounds a value to the specified number of decimals
* @param float value The value to be rounded
* @param int nrDecimals The number of decimals to round value to
* @return float value rounded to nrDecimals decimals
*/
round: function (value, nrDecimals) {
var x = nrDecimals > 0 ? 10 * parseInt(nrDecimals, 10) : 1;
return Math.round(value * x) / x;
}
}
MoreMath.round(float1, 1) => 12345.0
MoreMath.round(float2, 1) => 12345.5
MoreMath.round(float3, 1) => 12346.0
编辑:正如 Paolo 指出的那样,似乎存在一个内置功能。这个解决方案显然比我的要干净得多。使用 parseFloat,后跟 toFixed
你可以用切片!你只需要确保你知道如何使用它。正数 #s 相对于开头,负数相对于结尾。
js>"12345.00".slice(0,-1)
12345.0
评论
substring
.slice(0, -0)
@Jason S:
你可以用切片!你只需要 确保您知道如何使用它。 正 #s 是相对于 开头,负数是 相对于末尾。
js>“12345.00”.slice(0,-1) 12345.0
对不起,我的 graphomany,但帖子早些时候被标记为“jquery”。因此,您不能在 jQuery 中使用 slice(),因为 slice() 是用于使用 DOM 元素而不是子字符串进行操作的 jQuery 方法...... 换句话说,埃里克森@Jon回答了真正完美的解决方案。
但是,您的方法将在简单的 Javascript 中从 jQuery 函数中工作。 需要说的是,由于上次在评论中的讨论,jQuery比他自己的父公司最知名的ECMAScript更经常是JS的可再生扩展。
这里还存在两种方法:
作为我们的:
string.substring(from,to)
如果 'to' 索引 nulled 返回字符串的其余部分。 所以:正面或负面......string.substring(from)
和其他一些 - substr() - 提供子字符串范围和 'length' 只能是正数:
string.substr(start,length)
此外,一些维护者建议最后一种方法对 MSIE 不起作用或有错误。string.substr(start,length)
评论
String.prototype.slice
slice()
.slice
String.prototype
.data
slice
使用子字符串将所有内容放在_bar的左侧。但首先你必须在字符串中获取 _bar 的 instr:
str.substring(3, 7);
3 是开始,7 是长度。
评论
您可以使用 JavaScript 字符串对象的 substring 方法:
s = s.substring(0, s.length - 4)
它无条件地从字符串中删除最后四个字符。s
但是,如果要有条件地删除最后四个字符,则仅当它们完全是:_bar
var re = /_bar$/;
s.replace(re, "");
评论
slice
这里更好。s.slice(0, -4)
if(str.substring(str.length - 4) == "_bar")
{
str = str.substring(0, str.length - 4);
}
正则表达式就是你要找的:
let str = "foo_bar";
console.log(str.replace(/_bar$/, ""));
评论
最简单的方法是使用字符串的方法,它允许负位置(对应于字符串末尾的偏移量):slice
const s = "your string";
const withoutLastFourChars = s.slice(0, -4);
如果你需要一些更通用的东西来删除(包括)最后一个下划线之后的所有内容,你可以执行以下操作(只要保证至少包含一个下划线):s
const s = "your_string";
const withoutLastChunk = s.slice(0, s.lastIndexOf("_"));
console.log(withoutLastChunk);
试试这个:
<script>
var x="foo_foo_foo_bar";
for (var i=0; i<=x.length; i++) {
if (x[i]=="_" && x[i+1]=="b") {
break;
}
else {
document.write(x[i]);
}
}
</script>
您也可以在 http://jsfiddle.net/informativejavascript/F7WTn/87/ 上尝试实时工作示例。
评论
1.,多次捕获任何角色:(.*)
console.log("a string".match(/(.*).$/)[1]);
2. ,匹配最后一个字符,在本例中:.
console.log("a string".match(/(.*).$/));
3. ,匹配字符串的末尾:$
console.log("a string".match(/(.*).{2}$/)[1]);
评论
试试这个:
const myString = "Hello World!";
console.log(myString.slice(0, -1));
使用 JavaScript 的 slice 函数:
let string = 'foo_bar';
string = string.slice(0, -4); // Slice off last four characters here
console.log(string);
这可用于删除任何长度的字符串末尾的“_bar”。
debris = string.split("_") //explode string into array of strings indexed by "_"
debris.pop(); //pop last element off the array (which you didn't want)
result = debris.join("_"); //fuse the remainng items together like the sun
使用正则表达式:
let aStr = "12345.00";
aStr = aStr.replace(/.$/, '');
console.log(aStr);
评论
如果您不想要空间,只需使用修剪
"11.01 °C".slice(0,-2).trim()
如果你想删除靠近字符串末尾的东西(如果是可变大小的字符串),你可以结合 slice() 和 substr()。
我有一个带有标记的字符串,动态构建,带有一个用逗号分隔的锚标记列表。字符串是这样的:
var str = "<a>text 1,</a><a>text 2,</a><a>text 2.3,</a><a>text abc,</a>";
为了删除最后一个逗号,我做了以下操作:
str = str.slice(0, -5) + str.substr(-4);
这是一个我认为我在其他答案中没有看到的替代方案,只是为了好玩。
var strArr = "hello i'm a string".split("");
strArr.pop();
document.write(strArr.join(""));
不像切片或子字符串那样清晰或简单,但确实允许您使用一些不错的数组方法来玩字符串,因此值得了解。
性能
今天 2020.05.13 我在 MacOs High Sierra v10.13.6 上的 Chrome v81.0、Safari v13.1 和 Firefox v76.0 上对所选解决方案进行了测试。
结论
- (D)是短字符串和长字符串的快速或最快解决方案,建议将其作为快速跨浏览器解决方案
slice(0,-1)
- 基于 (C) 和 (E) 的解决方案速度很快
substring
substr
- 基于正则表达式 (A,B) 的解决方案是慢速/中速
- 解决方案 B、F 和 G 对于长字符串很慢
- 解 F 对于短字符串最慢,G 对于长字符串最慢
详
我对解决方案 A、B、C、D、E(EXT)、F、G(MY) 执行两个测试
解决方案在下面的代码片段中介绍
function A(str) {
return str.replace(/.$/, '');
}
function B(str) {
return str.match(/(.*).$/)[1];
}
function C(str) {
return str.substring(0, str.length - 1);
}
function D(str) {
return str.slice(0, -1);
}
function E(str) {
return str.substr(0, str.length - 1);
}
function F(str) {
let s= str.split("");
s.pop();
return s.join("");
}
function G(str) {
let s='';
for(let i=0; i<str.length-1; i++) s+=str[i];
return s;
}
// ---------
// TEST
// ---------
let log = (f)=>console.log(`${f.name}: ${f("12345.00")}`);
[A,B,C,D,E,F,G].map(f=>log(f));
This snippet only presents soutions
以下是 Chrome 短字符串的示例结果
请注意,对 UTF-16 编码的字符串进行操作String.prototype.{ split, slice, substr, substring }
前面的答案都不是 Unicode 感知的。
在大多数现代 JavaScript 引擎中,字符串被编码为 UTF-16,但更高的 Unicode 码位需要代理项对,因此较旧的、预先存在的字符串方法对 UTF-16 代码单元进行操作,而不是 Unicode 码位。
请参阅:不要使用 .split('')。
const string = "ẞ🦊";
console.log(string.slice(0, -1)); // "ẞ\ud83e"
console.log(string.substr(0, string.length - 1)); // "ẞ\ud83e"
console.log(string.substring(0, string.length - 1)); // "ẞ\ud83e"
console.log(string.replace(/.$/, "")); // "ẞ\ud83e"
console.log(string.match(/(.*).$/)[1]); // "ẞ\ud83e"
const utf16Chars = string.split("");
utf16Chars.pop();
console.log(utf16Chars.join("")); // "ẞ\ud83e"
此外,如旧答案中建议的那样,方法与末尾的换行符不匹配:RegExp
const string = "Hello, world!\n";
console.log(string.replace(/.$/, "").endsWith("\n")); // true
console.log(string.match(/(.*).$/) === null); // true
使用字符串迭代器循环访问字符
Unicode 感知代码利用字符串的迭代器;请参阅 Array.from
和 ...
spread。string[Symbol.iterator]
也可以使用(例如代替 )。string
另请参阅如何在 JavaScript 中将 Unicode 字符串拆分为字符。
例子:
const string = "ẞ🦊";
console.log(Array.from(string).slice(0, -1).join("")); // "ẞ"
console.log([
...string
].slice(0, -1).join("")); // "ẞ"
在s
u
RegExp
dotAll
或 s
标志使匹配换行符,unicode
或 u
标志启用某些与 Unicode 相关的功能。
请注意,使用该标志时,您可以消除不必要的身份转义,因为这些转义在 u
正则表达式中是无效的,例如 很好,因为它会启动一个没有反斜杠的字符类,但不是,因为它是一个带或不带反斜杠的,所以你需要删除反斜杠。.
u
\[
\:
:
例子:
const unicodeString = "ẞ🦊",
lineBreakString = "Hello, world!\n";
console.log(lineBreakString.replace(/.$/s, "").endsWith("\n")); // false
console.log(lineBreakString.match(/(.*).$/s) === null); // false
console.log(unicodeString.replace(/.$/su, "")); // ẞ
console.log(unicodeString.match(/(.*).$/su)[1]); // ẞ
// Now `split` can be made Unicode-aware:
const unicodeCharacterArray = unicodeString.split(/(?:)/su),
lineBreakCharacterArray = lineBreakString.split(/(?:)/su);
unicodeCharacterArray.pop();
lineBreakCharacterArray.pop();
console.log(unicodeCharacterArray.join("")); // "ẞ"
console.log(lineBreakCharacterArray.join("").endsWith("\n")); // false
请注意,某些字素由多个代码点组成,例如 它由序列 (U+1F3F3)、VS16
(U+FE0F)、ZWJ
(U+200D)、(U+1F308) 组成。
在这里,甚至会将其分为四个“字符”。
使用 RegExp set notation and properties of strings 提案,可以更轻松地匹配这些内容。🏳️🌈
🏳
🌈
Array.from
评论
事实上,您可以使用 删除数组的最后一项,如果数组长度为 5,则将删除最后 3 项。arr.length - 2
arr.length = 2
可悲的是,这不适用于字符串,但我们可以使用拆分字符串,然后在进行任何修改后连接字符串。split()
join()
var str = 'string'
String.prototype.removeLast = function(n) {
var string = this.split('')
string.length = string.length - n
return string.join('')
}
console.log(str.removeLast(3))
Via slice(indexStart, indexEnd) 方法 - 注意,这不会更改现有字符串,它会创建一个副本并更改副本。
console.clear();
let str = "12345.00";
let a = str.slice(0, str.length -1)
console.log(a, "<= a");
console.log(str, "<= str is NOT changed");
通过正则表达式方法 - 注意,这不会更改现有字符串,它会创建一个副本并更改副本。
console.clear();
let regExp = /.$/g
let b = str.replace(regExp,"")
console.log(b, "<= b");
console.log(str, "<= str is NOT changed");
通过 array.splice() 方法 -> 这仅适用于数组,并且它会更改现有数组(因此要小心),您需要先将字符串转换为数组,然后再返回。
console.clear();
let str = "12345.00";
let strToArray = str.split("")
console.log(strToArray, "<= strToArray");
let spliceMethod = strToArray.splice(str.length-1, 1)
str = strToArray.join("")
console.log(str, "<= str is changed now");
尝试使用toFixed
const str = "12345.00";
return (+str).toFixed(1);
评论