【问题标题】:JavaScript Regex Ternary stringJavaScript 正则表达式 三元字符串
【发布时间】:2014-11-04 16:08:30
【问题描述】:

我将 grunt usemin 和 filerev 与 uglify 一起用于版本化静态资产。

在我们遇到使用 if/else 运算符的情况之前,JS 文件中的角度 HTML 模板替换效果很好

if($scope.isPdf){
    $scope.templateUrl = '/views/results/breakdown-detailed.html';
} else {
    $scope.templateUrl = '/views/results/breakdown.html';
}

在 uglify 之后将事物转换为单行三元运算符

$scope.templateUrl=$scope.isPdf?"/views/results/breakdown-detailed.html":"/views/results/breakdown.html"}}

现在用于替换目标模板字符串的正则表达式不再捕获所有 html 案例

/templateUrl\s?[:=]\s?['"]([^"']+)["']/gm

有人有一个正则表达式可以涵盖这两个值的三元情况吗?

如果它还可以在单​​个正则表达式中涵盖原始案例,那就太好了。

$scope.templateUrl=$scope.isPdf?"/views/results/breakdown-detailed.html":"/views/results/breakdown.html"}}

if($scope.isPdf){
    $scope.templateUrl = '/views/results/breakdown-detailed.html';
} else {
    $scope.templateUrl = '/views/results/breakdown.html';
}

我会在 regexr 中测试一下。

【问题讨论】:

  • 我可以看到解析单个独立构造,但是当它嵌入到范围语言内在函数中时它不会真正起作用。为此,您必须解析语言。

标签: javascript regex angularjs grunt-usemin


【解决方案1】:

使用表单的正则表达式

templateUrl(([^?]*)\?([^:]*):([^;]*)|(\s*=\s*)[^;]*)

这将捕获任何后跟templateUrl

例如,请参阅http://regex101.com/r/hD4wU7/1 了解正则表达式的匹配方式。

说明

  • templateUrl 匹配 templateUrl

  • ([^?]*)\?([^:]*):([^;]*) 匹配三元运算符

    • ([^?]*)\? 匹配除? 后跟问号之外的任何内容

    • ([^:]*): 匹配除: 后跟: 以外的任何内容

    • ([^;]*) 匹配除; 以外的任何内容

  • (\s*=\s*)[^;]*) 匹配 if 大小写。

    • (\s*=\s*) 匹配 =
    • [^;]*) 匹配除 ; 以外的任何内容

【讨论】:

  • 如果我的问题具有误导性,我们深表歉意。我遇到的问题是我的正则表达式可以很好地匹配任何带有$scope.templateUrl = 'filename' 的行。当 uglifyJS 将 if/else 转换为三元运算符时,我的正则表达式不再能够获取三元运算符值的 templateUrls。如果您有一个正则表达式来匹配两个/任何一个三元值,那就太好了。感谢您的帮助!
猜你喜欢
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多