Javascript模式匹配和表达式评估逻辑

时间:2013-10-11 10:13:04

标签: javascript regex

我有一个javascript字符串,我想将其作为表达式进行评估并与值进行比较。

var stringExpression=">.5*{PropertyValue} + .2*{DesignValue}+ 2000 +{price}"; 

花括号内的值是dom中存在的元素id,上面的表达式是动态的,但我想要选择其值的元素将始终存在于花括号内。我计划使用jquery选择这些值。 $( “#的PropertyValue”)。VAL()。有人可以告诉我如何在javascript post中设置dom中的值以及如何替换值的任何想法,我是否需要使用split函数或者可以使用一些正则表达式来实现它。

您也可以向我指出javascript中可以帮助解决此问题的任何框架。

提前致谢。

2 个答案:

答案 0 :(得分:0)

var str=">.5*{PropertyValue} + .2*{DesignValue}+ 2000 +{price}"; 

var regExp = /{(.*?)}/
var values = []
var match = str.match(regExp)
while (match != null) {
    var value = document.getElementById(match[1])
    str = str.replace(match[0], value)
    values.push(value)
    match = str.match(regExp)
}

答案 1 :(得分:0)

这是功能范例中的一个解决方案,它读得非常好:

function value(tag)
{
    var key = tag.substr(1, tag.length - 2) //remove braces
    return document.getElementById(key)
}


function populate(template)
{
    var tagRegExp = /{.+?}/g
    var tags = template.match(tagRegExp)
    var values = tags.map(value)
    return template.split(tagRegExp).zip(values).join("")
}

var template=">.5*{PropertyValue} + .2*{DesignValue}+ 2000 +{price}"; 
console.log(populate(template))

此解决方案需要zip方法来处理数组对象,可以按照以下方式实现(除非它已由库提供)。

Array.prototype.zip = function (other) {
    function zipOne(acc, x, i, a)
    {
        if (i < other.length) {
            if (i < a.length - 1) {
                return acc.concat([x, other[i]])
            } else {
                return acc.concat([x]).concat(other.slice(i))            
            }
        } else {
            return acc.concat([x])
        }
    }

    return this.reduce(zipOne, [])
}