无法使用子字符串从javascript获取所需的值

时间:2016-07-18 15:20:06

标签: javascript regex string substring

背景

我目前已经构建了一个用于抓取SharePoint集合的webApi。我正在通过csom获取图像base64和所有需要的属性。我通过我的控制器将所有这些值返回到我正在处理的word.js应用程序。

问题

我得到的字符串值是"width=611px;height=262px;"。您可能会告诉我我希望从此字符串中获取宽度和高度,并将它们分配给单独的变量。

当前方法

我之前有过关于Regex和子字符串的对话,众所周知,使用子字符串比正则表达式更有效。但是我想知道在这种情况下,正则表达式是否比使用子字符串更有效?

当前代码

var Widthtest = contentObject.ImageSize[x].replace("width=", '').replace("height=", '').replace("px", '').replace(";", '').trim();

当前的代码问题

  1. 提供的代码示例将高度和宽度的值组合在一个字符串中。
  2. 提供的代码示例很简陋,可能会引起其他开发人员的混淆
  3. 期望的结果

    我的最终目标是让两个变量分别保持宽度和高度的值。来自与"width=611px;height=262px;"

    格式相同的字符串
    var height = height.value;
    
    var width = width.value;
    

3 个答案:

答案 0 :(得分:2)

字符串是固定格式,您需要知道的是第一个;的位置 - 您可以根据字符串中的偏移量提取值。我个人认为没有理由使用正则表达式。

var pos = str.indexOf(";");

var w = str.substr(6, pos - 8);
var h = str.substr(pos + 8, str.length - pos - 11);

答案 1 :(得分:1)

您拥有的一个选项是使用regex分别为这两个值设置捕获组。你可以用......

var re = /width=(\d{1,4})px;height=(\d{1,4})px;/;

...作为您的regex。该模式假设heightwidth都在1到4位数之间。第一个捕获组将是宽度值,第二个是高度值。

要实际使用它并按照您想要的方式分配这些捕获的值,请执行以下操作:

var height = re.exec('width=611px;height=262px;')[2]; //2 for the second capturing group
var width = re.exec('width=611px;height=262px;')[1]; //1 for the first capturing group

var testStr = 'width=611px;height=262px;';
var re = /width=(\d{1,4})px;height=(\d{1,4})px;/;

console.log('Width: %d', Number(re.exec(testStr)[1]));
console.log('Height: %d', Number(re.exec(testStr)[2]));

答案 2 :(得分:1)

这在一定程度上取决于输入数据的可靠性。正则表达式的一个显着优点是它提供了一种验证整个输入字符串格式的便捷方法。

不是我一定会推荐这种方法来解决可读性问题,但你可以在Javascript 1.7 +中使用解构赋值作为单行代码来实现:

[ , width, height ] = (/width=(\d+)px;height=(\d+)px;/.exec(str) || [0,0,0]).map(Number);

请注意,[0,0,0]是输入字符串格式无效的默认回退。

完整的测试代码:

var str = "width=611px;height=262px;",
    width, height;

[ , width, height ] = (/width=(\d+)px;height=(\d+)px;/.exec(str) || [0,0,0]).map(Number);

console.log('Width = ' + width);
console.log('Height = ' + height);

输出:

Width = 611
Height = 262

替代版本

这个更具学术性:

var str = "width=611px;height=262px;",
    size, width, height;

if(size = /width=(\d+)px;height=(\d+)px;/.exec(str)) {
  [ width, height ] = size.slice(1).map(Number);
}
else {
  throw "invalid format";
}

没有正则表达式

如果您的输入数据足够可靠并且您不需要检查其格式,那么这样的内容也可以正常运行:

var str = "width=611px;height=262px;",
    width, height;

[ width, height ] = str.split('=').slice(1).map(function(s) { return parseInt(s, 10); });