【问题标题】:retrieving regular expression match group values检索正则表达式匹配组值
【发布时间】:2015-05-07 17:05:48
【问题描述】:

这是脚本;:

var output = []
output = this.getField("SelectedSoftware").value.match(/\$(\d{1,4}\.\d\d)/g);

字段中的示例文本:

Automate、Audition ($500.00)、Citrix Receiver、AutoCAD ($54.93)、Clarity Studio ($748.23)、Audacity ($300.00)、Audition ($500.00)、Business Objects Dashboard、Audition ($500.00)、

我遇到的问题是只获取成本数字,因此可以将它们加在一起以显示总计。 (?<=\$) 似乎不起作用。所以我将表达式的其余部分分组在括号中。但是,我不确定如何获取这些组值而不是完整匹配项。

【问题讨论】:

标签: javascript arrays regex


【解决方案1】:

RegExp.exec(string) 应该很有帮助。事实上,这是从字符串中获取捕获组的唯一方法。不过实现有点困难,因为.exec() 只返回一个结果。

示例代码:

var regex = /\$(\d{1,4}\.\d\d)/g,
    text = this.getField("SelectedSoftware").value,
    prices = [],
    total = 0,
    num;

// Assignments always return the value that is assigned.
// .exec will return null if no matches are found.
while((val = regex.exec(text)) !== null){
  // Capture groups are referenced with 'val[x]', where x is the capture group number.
  num = parseFloat(val[1]);
  total += num;
  prices.push(num);
}

Here's a fiddle.

之所以有效,是因为RegExp 对象有一个名为.lastIndex 的属性,它是下一次.exec() 搜索的基础。

你可以read more about .exec() on the MDN

【讨论】:

  • 感谢@GrandonBroseph。除了使用 parseFloat 之外,这正是我所需要的。
【解决方案2】:

您可以使用(?: ) 创建非捕获组,但我认为在这种情况下您不需要它。

MDN: Working with regular expressions

exec:在字符串中执行匹配搜索的 RegExp 方法。 它返回一个信息数组。
test:一种用于测试的 RegExp 方法 用于字符串中的匹配。它返回真或假。
匹配:一个字符串 执行在字符串中搜索匹配项的方法。它返回一个 信息数组或不匹配时为 null。
搜索:字符串方法 测试字符串中的匹配项。它返回匹配的索引, 如果搜索失败,则为 -1。
replace:一个String方法,它执行一个 在字符串中搜索匹配,并替换匹配的子字符串 带有替换子字符串。
split:使用 正则表达式或固定字符串将字符串分解为数组 子字符串。

你需要的是RegExp.exec,它会返回一个信息数组,你可以获取捕获的组。

它返回一个数组,其中包含[0] 中的整个匹配项,然后将每个捕获的组放在以下数组槽中。所以你想要的是:

var price = /\$(\d{1,4}\.\d\d)/.exec("$59.99")[1];

【讨论】:

    【解决方案3】:

    我得到的只是成本数字,因此可以将它们加在一起以显示总数。 String.prototype.match 总是返回一个你想要的数组。

    完整查看DEMO

    var output = []
    output = "Automate, Audition ($500.00), "
             +"Citrix Receiver, AutoCAD ($54.93), "+
             +"Clarity Studio ($748.23), Audacity "
             +"($300.00), Audition ($500.00), Business "
             +"Objects Dashboard, Audition ($500.00),"
            .match(/\$(\d{1,4}\.\d\d)/g);
    

    输出:

    ["$500.00", "$54.93", "$748.23", "$300.00", "$500.00", "$500.00"]
    

    现在您可以使用此正则表达式 /(\d{1,4}\.\d\d)/g 简单地添加所有数字。


    获取这些值的总和:

    var total = 0;
    for(var _=0; _<output.length; _++)
        total += parseFloat(output[_]);
    

    OUTPUT2603.16

    【讨论】:

    • 这根本不能回答问题。
    • 现在好像完成了;)
    • 使用parseInt() 可能不是一个好主意,因为有些数字不是整数。要保留十进制数字,最好使用parseFloat()
    • 所以我调整了一些正则表达式,没有使用parseInt,而是使用了parseFloat。请原谅困扰@GrandonBroseph
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    相关资源
    最近更新 更多