【问题标题】:How can I get last characters of a string如何获取字符串的最后一个字符
【发布时间】:2011-08-17 22:40:39
【问题描述】:

我有

var id="ctl03_Tabs1";

使用 JavaScript,我如何获取最后五个字符或最后一个字符?

【问题讨论】:

  • 要获取最后一个字符,最好的选择是 id.charAt(id.length-1)
  • 读者注意:请务必阅读第一个答案,尤其是来自@Terence 的答案。

标签: javascript


【解决方案1】:

编辑:正如其他人指出的那样,使用 slice(-5) 而不是 substr 但是,请参阅此答案底部的 .split().pop() 解决方案以了解另一种方法。

原答案:

您需要结合使用 Javascript 字符串方法 .substr().length 属性。

var id = "ctl03_Tabs1";
var lastFive = id.substr(id.length - 5); // => "Tabs1"
var lastChar = id.substr(id.length - 1); // => "1"

这将获取从 id.length - 5 开始的字符,并且由于 .substr() 的第二个参数被省略,因此继续到字符串的末尾。

您也可以使用下面其他人指出的.slice() 方法。

如果您只是想查找下划线后的字符,您可以使用:

var tabId = id.split("_").pop(); // => "Tabs1"

这会将字符串拆分为下划线的数组,然后从数组中“弹出”最后一个元素(这是您想要的字符串)。

【讨论】:

  • 第一个解决方案可以做得更短更快,见下面我的回答。不过,在这种特殊情况下,我确实同意分裂和流行的想法。
  • Compared 到 .slice(-5) 和 .substr(length - 5),.split().pop() 对性能有很大影响。如果这是您在循环中使用的东西并且性能很关键,那么您需要牢记这一点。
  • 在您的测试中,.split().pop() 仍然是每秒 500 万次操作。在出现性能问题之前,这不是性能问题。 ;)
  • @HutchMoore 你是对的。我已经编辑了我的答案,提到 slice 在这一点上是一个更好的选择。
  • 如果您在这里是因为您想检索文件名的扩展名,那么filename.split(".").pop() 比使用负值 3 切片要聪明得多。很多这些答案都提到使用负值,但是当Tabs12 出现并且你得到abs12 时会发生什么。这里发布的.split("_").pop() 解决方案再次比任何人说应该使用切片的人聪明得多
【解决方案2】:

不要使用.substr()。请改用 .slice() 方法,因为它是跨浏览器兼容的(参见 IE)。

const id = "ctl03_Tabs1";
console.log(id.slice(id.length - 5)); //Outputs: Tabs1
console.log(id.slice(id.length - 1)); //Outputs: 1

substr() with negative value not working in IE

【讨论】:

  • 是的,切片接受负值,这很棒! slice() 参考:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 我更喜欢这个答案,虽然接受的答案很好。
  • 这应该是答案,这样使用 slice 也更高效:jsperf.com/slice-vs-substr-and-length
  • Chrome 55 似乎认为 substr 快了 20%
  • 我认为切片只有在一致的情况下才能工作?如果结尾是 _Tabs15 怎么办? slice(-5) 只会抓住 abs15 吗?对于不同的长度,split/pop 的效果要好得多...
【解决方案3】:

您可以使用带有负起始位置的substr() method 来检索最后n 个字符。例如,这获取最后 5 个:

var lastFiveChars = id.substr(-5);

【讨论】:

  • 最佳简短答案。无需知道原始字符串长度(针对当前浏览器,所以我们排除了 IE)
  • 这是迄今为止实现结果的最佳和最短的方法
  • 这听起来不错,但并不总是有效,请参阅此处:w3schools.com/jsref/tryit.asp?filename=tryjsref_substring4
  • @RogerPerkins 当这篇文章是关于 substr 时,你为什么要发布一个带有 substring 的示例??
  • 我对哪种语言使用哪个子字符串命令感到困惑,看起来 javascript 可以使用其中任何一个,尽管看起来只有 substr 可以正确处理负数。看起来连 w3schools 都对 substr 的操作感到困惑,声明为负数:
    如果 start 为负数,substr() 将其用作字符串末尾的字符索引。
    如果 start 为负数或大于字符串长度,则 start 设置为 0
【解决方案4】:

获取最后一个字符很容易,因为您可以将字符串视为数组:

var lastChar = id[id.length - 1];

要获取字符串的一部分,可以使用substr 函数或substring 函数:

id.substr(id.length - 1); //get the last character
id.substr(2);             //get the characters from the 3rd character on
id.substr(2, 1);          //get the 3rd character
id.substr(2, 2);          //get the 3rd and 4th characters

substrsubstring 之间的区别在于如何处理第二个(可选)参数。在substr 中,它是索引中的字符数(第一个参数)。在substring 中,它是字符切片结束位置的索引。

【讨论】:

  • 你有一个错字 susbstr 应该是 substr
【解决方案5】:

以下脚本显示了使用 JavaScript 获取字符串中最后 5 个字符和最后 1 个字符的结果:

var testword='ctl03_Tabs1';
var last5=testword.substr(-5); //Get 5 characters
var last1=testword.substr(-1); //Get 1 character

输出:

Tabs1 // 有 5 个字符

1 // 得到 1 个字符

【讨论】:

  • 不兼容IE,看我的回答。
【解决方案6】:

一种方法是使用slice,如下所示:

var id="ctl03_Tabs1";
var temp=id.slice(-5);

所以temp 的值将是"Tabs1"

【讨论】:

    【解决方案7】:

    查看substring function

    获取最后一个字符:

    id.substring(id.length - 1, id.length);
    

    【讨论】:

      【解决方案8】:
      const r = '6176958e92d42422203a3c58'; 
      r.slice(-4)
      

      结果'3c58'

      r.slice(-1)
      

      结果'8'

      【讨论】:

      • Slice 已被多次推荐,但解释更多。值得注意的是,与this highly voted answer 相比,这并没有提供任何新的东西。请不要重复现有的指导,尤其是解释较少的情况。
      【解决方案9】:

      Substr 函数允许您使用减号来获取最后一个字符。

      var string = "hello";
      var last = string.substr(-1);
      

      它非常灵活。 例如:

      // Get 2 characters, 1 character from end
      // The first part says how many characters
      // to go back and the second says how many
      // to go forward. If you don't say how many
      // to go forward it will include everything
      var string = "hello!";
      var lasttwo = string.substr(-3,2);
      // = "lo"
      

      【讨论】:

        【解决方案10】:

        无需使用substr 方法来获取字符串的单个字符!

        以 Jamon Holmgren 为例,我们可以更改 substr 方法并简单地指定数组位置:

        var id = "ctl03_Tabs1";
        var lastChar = id[id.length - 1]; // => "1"
        

        【讨论】:

          【解决方案11】:

          性能

          今天 2020.12.31 我在 Chrome v87、Safari v13.1.2 和 Firefox v84 上对 MacOs HighSierra 10.13.6 进行测试,以获取最后 N 个字符大小写的选定解决方案(最后一个字母大小写结果,为清楚起见,我在 separate answer )。

          结果

          适用于所有浏览器

          • 基于slice 的解决方案 D 很快或最快
          • 解决方案 G 最慢

          详情

          我执行 2 个测试用例:

          • 当字符串有 10 个字符时 - 你可以运行它HERE
          • 当字符串有 1M 个字符时 - 你可以运行它HERE

          下面 sn-p 给出了解决方案 A B C D E F G(我的)

          //https://stackoverflow.com/questions/5873810/how-can-i-get-last-characters-of-a-string
          
          // https://stackoverflow.com/a/30916653/860099
          function A(s,n) {
            return s.substr(-n)
          }
          
          // https://stackoverflow.com/a/5873890/860099
          function B(s,n) {
            return s.substr(s.length - n)
          }
          
          // https://stackoverflow.com/a/17489443/860099
          function C(s,n) {
            return s.substring(s.length - n, s.length);
          }
          
          // https://stackoverflow.com/a/50395190/860099
          function D(s,n) {
            return s.slice(-n);
          }
          
          // https://stackoverflow.com/a/50374396/860099
          function E(s,n) {
            let i = s.length-n;
            let r = '';
            while(i<s.length) r += s.charAt(i++);
            return r
          }
          
          // https://stackoverflow.com/a/17489443/860099
          function F(s,n) {
            let i = s.length-n;
            let r = '';
            while(i<s.length) r += s[i++];
            return r
          }
          
          // my
          function G(s,n) {
            return s.match(new RegExp(".{"+n+"}$"));
          }
          
          // --------------------
          // TEST
          // --------------------
          
          [A,B,C,D,E,F,G].map(f=> {  
            console.log(
              f.name + ' ' + f('ctl03_Tabs1',5)
            )})
          This shippet only presents functions used in performance tests - it not perform tests itself!

          以下是 chrome 的示例结果

          【讨论】:

            【解决方案12】:

            如果您只想要最后一个字符或已知位置的任何字符,您可以简单地将字符串作为数组! - 字符串在 javascript 中是可迭代的 -

            Var x = "hello_world";
             x[0];                    //h
             x[x.length-1];   //d
            

            但是,如果您需要的不仅仅是一个字符,那么使用拼接是有效的

            x.slice(-5);      //world
            

            关于你的例子

            "rating_element-<?php echo $id?>"
            

            要提取 id,您可以轻松使用 split + pop

            Id= inputId.split('rating_element-')[1];
            

            这将返回 id,如果在 'rating_element' 之后没有 id,则返回 undefined :)

            【讨论】:

              【解决方案13】:
              var id="ctl03_Tabs1";
              var res = id.charAt(id.length-1);
              

              我发现了这个问题,并通过一些研究发现这是获取最后一个字符的最简单方法。

              正如其他人提到并添加的完整性以获得最后 5 个:

              var last5 = id.substr(-5);
              

              【讨论】:

                【解决方案14】:

                性能

                今天 2020.12.31 我在 Chrome v87、Safari v13.1.2 和 Firefox v84 上对 MacOs HighSierra 10.13.6 执行测试,以获取用于获取最后一个字符大小写的选定解决方案(最后 N 个字母大小写结果,为清楚起见,我在 separate answer )。

                结果

                适用于所有浏览器

                • 解决方案 D、E、F 非常快或最快
                • 解决方案 G、H 最慢

                详情

                我执行 2 个测试用例:

                • 当字符串有 10 个字符时 - 你可以运行它HERE
                • 当字符串有 1M 个字符时 - 你可以运行它HERE

                下面 sn-p 给出了解决方案 A B C D E F G(我的),H(我的)

                //https://stackoverflow.com/questions/5873810/how-can-i-get-last-characters-of-a-string
                
                // https://stackoverflow.com/a/30916653/860099
                function A(s) {
                  return s.substr(-1)
                }
                
                // https://stackoverflow.com/a/5873890/860099
                function B(s) {
                  return s.substr(s.length - 1)
                }
                
                // https://stackoverflow.com/a/17489443/860099
                function C(s) {
                  return s.substring(s.length - 1, s.length);
                }
                
                // https://stackoverflow.com/a/50395190/860099
                function D(s) {
                  return s.slice(-1);
                }
                
                // https://stackoverflow.com/a/50374396/860099
                function E(s) {  
                  return s.charAt(s.length-1);
                }
                
                // https://stackoverflow.com/a/17489443/860099
                function F(s) {  
                  return s[s.length-1];
                }
                
                // my
                function G(s) {
                  return s.match(/.$/);
                }
                
                // my
                function H(s) {
                  return [...s].pop();
                }
                
                // --------------------
                // TEST
                // --------------------
                
                [A,B,C,D,E,F,G,H].map(f=> {  
                  console.log(
                    f.name + ' ' + f('ctl03_Tabs1')
                  )})
                This shippet only presents functions used in performance tests - it not perform tests itself!

                以下是 chrome 的示例结果

                【讨论】:

                  【解决方案15】:

                  您可以利用string.length 功能获取最后一个字符。请看下面的例子:

                  let str = "hello";
                  console.log(str[str.length-1]);
                  // Output : 'o' i.e. Last character.
                  

                  同样,您可以使用for 循环使用上述代码来反转字符串。

                  【讨论】:

                    【解决方案16】:
                    const id = 'ctl03_Tabs1';
                    id.at(-1); // Returns '1'
                    

                    at支持负整数从最后一个字符串字符倒数。


                    文档:String/at

                    【讨论】:

                      【解决方案17】:

                      假设您将子字符串与另一个字符串的结尾进行比较并将结果用作布尔值,您可以扩展 String 类来完成此操作:

                      String.prototype.endsWith = function (substring) {
                        if(substring.length > this.length) return false;
                        return this.substr(this.length - substring.length) === substring;
                      };
                      

                      允许您执行以下操作:

                      var aSentenceToPonder = "This sentence ends with toad"; 
                      var frogString = "frog";
                      var toadString = "toad";
                      aSentenceToPonder.endsWith(frogString) // false
                      aSentenceToPonder.endsWith(toadString) // true
                      

                      【讨论】:

                      • 您现在已经获得了重新定义the built in endsWith method 的代码...开玩笑,这就是startsWith 方法。但它表明,在对内置对象定义自己的方法之前,您应该始终测试现有方法。并且可能完全远离内置方法,例如 lodash 和 underscore。
                      【解决方案18】:

                      要获取字符串的最后一个字符,可以使用split('').pop() 函数。

                      const myText = "The last character is J";
                      const lastCharater = myText.split('').pop();
                      console.log(lastCharater); // J
                      

                      这是有效的,因为当split('') 函数有empty('') 作为参数时,字符串的每个字符都会被更改为数组的一个元素。因此,我们可以使用pop() 函数返回该数组的最后一个元素,即'J' 字符。

                      【讨论】:

                        【解决方案19】:

                        我实际上有以下问题,这是我如何通过上述答案解决的,但是从输入元素中提取 id 的方法不同。

                        我已经附加了输入文件

                        id="rating_element-<?php echo $id?>"
                        

                        而且,当点击那个按钮时,我只想提取 id(即数字)或 php ID ($id)

                        所以这就是我的工作。

                         $('.rating').on('rating.change', function() {
                                    alert($(this).val());
                                   // console.log(this.id);
                                   var static_id_text=("rating_element-").length;       
                                   var product_id =  this.id.slice(static_id_text);       //get the length in order to deduct from the whole string    
                                  console.log(product_id );//outputs the last id appended
                                });
                        

                        【讨论】:

                          【解决方案20】:

                          如果逗号是字符串中的最后一个字符,这个将删除逗号..

                          var str = $("#ControlId").val();
                          
                          if(str.substring(str.length-1)==',') {
                          
                            var stringWithoutLastComma = str.substring(0,str.length-1);    
                          
                          }
                          

                          【讨论】:

                          • 这与原来的问题几乎没有关系。
                          【解决方案21】:

                          最后 5 个

                          var id="ctl03_Tabs1";
                          var res = id.charAt(id.length-5)
                          alert(res);

                          最后

                             
                           var id="ctl03_Tabs1";
                           var res = id.charAt(id.length-1)
                          alert(res);

                          【讨论】:

                          • 对于第一个示例,将charAt 更改为substrcharAt 获得倒数第五个
                          【解决方案22】:

                          我相信这会奏效....

                          var string1="myfile.pdf"
                          var esxtenion=string1.substr(string1.length-4)
                          

                          extension 的值将是 ".pdf"

                          【讨论】:

                            【解决方案23】:

                            这里有 2 个示例将始终显示最后一个字符

                            var id="ctl03_Tabs1";
                            
                            console.log(id.charAt(id.length - 1)); 
                            
                            console.log(id[id.length - 1]); 

                            【讨论】:

                              猜你喜欢
                              • 2011-07-07
                              • 1970-01-01
                              • 2021-02-11
                              • 2011-02-10
                              • 2013-07-06
                              • 2011-11-18
                              • 1970-01-01
                              相关资源
                              最近更新 更多