【问题标题】:Get first value if there is a match如果匹配,则获取第一个值
【发布时间】:2014-03-01 23:55:02
【问题描述】:

好的,所以我有一个带有匹配正则表达式查询的简单变量声明。

var image = decl.val.match(/(url\(.*\))/)[1];

但我很快发现我不能这样做,因为有时没有匹配,而不是返回 undefined 或类似的错误出现:

Uncaught TypeError: Cannot read property '1' of null

我想尽可能内联地解决这个问题,因为我将不得不在我的代码中多次迭代。感谢您的帮助!

【问题讨论】:

  • “我想尽可能内联地解决这个问题,因为我将不得不在我的代码中多次迭代这个问题。” - 你熟悉一个叫做“函数”的概念…?
  • @CBroe 是的,但我想使用条件三元运算符来执行此操作......这只是一种偏好。
  • 你可能得到的最短的单行是var image = decl.val.match(…); image = image ? image[1] : ""(或者你喜欢的""的替代品。)
  • True...这更多是为了我自己的信息,但我想看看是否有任何方法可以编写像 var m = decl.val.match(/url(.*) 这样的条件/) ?: 这个[1];

标签: javascript regex arrays match typeerror


【解决方案1】:

而不是试图找到神奇的 1 行解决方案,您可以这样做:

var m = decl.val.match(/url\(.*\)/);
var image = m ? m[0] : "";

【讨论】:

  • 是的......我想我可以做到......但我想知道是否有一些我不知道的隐藏的三元运算符。就像你可以做 var m = decl.val.match(/url(.*)/) ?: this[1];
  • 如果你注意到的话,我已经在使用三元运算符了。可以在一行中调用test 然后match 但这仍然是对正则表达式进行两次评估。
  • 所以不存在 var m = decl.val.match(/url(.*)/) ?: this[1];
  • No this 的意思完全不同。
  • 但是没有办法复制那个功能?
【解决方案2】:

你可能得到的最短的单行是
var image = decl.val.match(/(url\(.*\))/)); image = image ? image[1] : ""
(或者您首选的 "" 替代方案是什么。)


哦,好吧,想想,你还可以走得更远一点
var image = (image = decl.val.match(/(url\(.*\))/)) ? image[1] : "";
如果你觉得这样更好……

这是因为变量在 JavaScript 中是“提升”的——这意味着首先在代码中搜索所有变量声明(在这种情况下为var image)并创建这些变量,然后只执行实际代码之后。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-18
    • 2022-07-20
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多