【问题标题】:Most efficient way to extract parts of string提取部分字符串的最有效方法
【发布时间】:2016-08-26 18:53:35
【问题描述】:

我有一堆格式为“TYPE_1_VARIABLE_NAME”的字符串。

目标是得到3个形式的变量:

varType = 'TYPE',
varNumber = '1',
varName = 'VARIABLE_NAME'

实现这一目标的最有效方法是什么?

我知道我可以使用:

var firstUnderscore = str.indexOf('_')
varType = str.slice(0, firstUnderscore))
varNumber = str.slice(firstUnderscore+1,firstUnderscore+2)
varName = str.slice(firstUnderscore+3)

但这感觉是一种糟糕的做法。有没有更好的办法?正则表达式?

或者我应该将变量重命名为“TYPE_1_variableName”并执行以下操作:

varArray = str.split('_')

然后得到它们:

varType = varArray[0],
varNumber = varArray[1],
varName = varArray[2]

任何帮助表示赞赏。 jQuery 也可以。

【问题讨论】:

  • 您所说的“更好”或“最有效”是什么意思?究竟是什么让选项 A 比选项 B 或 C“更好”?什么最有效?代码执行?代码可维护性?可读性?
  • 正则表达式
  • 我推荐var arr = str.split('_') 方法
  • (.*?)_(.*?)_(.*?)$,您的团队将拥有您的价值观。或(.*?)_(.*?)_(.*)
  • 在这种情况下,我不会太担心速度(除非您循环数以万计),所以选择对您来说最易读的那个。

标签: javascript jquery split


【解决方案1】:

正则表达式解决方案

鉴于第一个和第二个下划线是分隔符,这种正则表达式方法将提取部分(允许在最后部分使用下划线):

//input data
var string = 'TYPE_1_VARIABLE_NAME';

//extract parts using .match()
var parts = string.match(/([^_]+)_([^_]+)_([^$]+)/);

//indexes 1 through 3 contains the parts
var varType = parts[1];
var varNumber = parts[2];
var varName = parts[3];

鉴于第一个变量由字符和第二个数字组成,可以使用这个更具体的正则表达式:

var parts = string.match(/(\w+)_(\d)_(.+)/);

非正则表达式解决方案

使用.split('_'),您可以这样做:

//input data
var string = 'TYPE_1_VARIABLE_NAME';

//extract parts using .split()
var parts = string.split('_');

//indexes 0 and 1 contain the first parts
//the rest of the parts array contains the last part
var varType = parts[0];
var varNumber = parts[1];
var varName = parts.slice(2).join('_');

在效率方面,两种方法包含的代码量大致相同。

【讨论】:

    【解决方案2】:

    你可以使用正则表达式和split

    var string='TYPE_1_VARIABLE_NAME';
    
    var div=string.split(/^([A-Z]+)_(\d+)_(\w+)$/);
    
    console.log('type:'+div[1]);
    console.log('num:'+div[2]);
    console.log('name:'+div[3]);

    【讨论】:

      【解决方案3】:

      这是我找到的答案here

      var array = str.split('_'),
          type = array[0], number = array[1], name = array[2];
      

      ES6 标准化了解构赋值,它允许您执行 Firefox 已经支持了很长时间的事情:

      var [type, number, name] = str.split('_');
      

      您可以使用 Kangax 的 compatibility table 检查浏览器支持。

      这是一个示例Fiddle

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-12
        • 1970-01-01
        • 1970-01-01
        • 2021-11-26
        • 2014-04-04
        • 1970-01-01
        相关资源
        最近更新 更多