0

我有一些我经常需要手动更改的数字列表,当它运行时,现在在 var str(下面的#1)中列出了一个小样本,它给出了(#2)作为输出。我想要发生的是 var xyz 每次遇到新部分时都会更改,并继续用新的 var 标记它们,直到它进入下一个部分。(#3) 我希望我的问题很清楚。(显然不是......)我知道我做错了什么,而且这可能不是一开始就以最好的方式编写的。因此,任何提示将不胜感激。

(19.32 规格 03 20.56 2 20.84 3 39.32 规格 04 30.56 2 30.84 3)

(19.32 规格 03 20.56 规格 06 20.84 规格 06 39.32 规格 04 30.56 规格 06 30.84 规格 06)

( 19.32 spec03 20.56 spec03 20.84 spec03 39.32 spec04 30.56 spec04 30.84 spec04) [粗体值是新部分的第一个实例]

var xyz = 'spec06';
var str = '19.32    spec03 20.56    2 20.84 3';
var patt1 = /([0-9]+\.[0-9]+\t)([0-9]+)/;
var patt2 = /([0-9]+\.[0-9]+\t)(spec[0-9]+)/;
function cleaner() {
for (i = 1; i <= 150; i++) {
    //xyz = str.replace(patt2, '$1') <-- this crashes the program...?
    str = str.replace(patt1, '$1' + xyz)

    }

}

实时版本注意:您需要一些制表符分隔的输入才能响应...

这里是一些输入的样品,我将使用:278.091182 spec35 279.300274 2 279.842670 3 280.204268 281.006563 4 5 6 281.503759 282.339954 7 282.532053 8 282.690252 9 283.300448 10 285.357034 11 285.718632 12 286.407927 287.809118ëspec36 288.747012 2 288.927811 3 289.266809 4

4

2 回答 2

1

我不会在这里使用循环,而是使用带有for 函数replace的全局正则表达式。它确实匹配整个组(数字加规范,或数字和整数)并将其替换为数字加规范。如果规格号匹配,它将更新spec变量并使用它:

var str = '19.32    spec03 20.56    2 20.84 3';
var spec = "06"; // initial spec number
return str.replace(/(\d+\.\d+)\s+(spec)?(\d+)/g, function(whole, num, sp, spn) {
    if (sp) // second group matched "spec"
        spec = spn; // set new spec number
    return num + "\tspec" + spec;
});

在 jsfiddle.net 上的演示

于 2012-08-02T21:09:47.270 回答
0

我完全修改了您的代码,但这应该可以做到:

var str = '19.32    spec03 20.56    2 20.84 3';
var items = str.split(/\s+/);   // break up at whitespace

var xyz = "spec06"; // spec number
items = items.map(function(item) {    // cycle through and modify each item
    if(item.indexOf("spec") != -1) {    
        xyz = item; // keep track of spec number
        return item;
    } else {
        return item+xyz;    // append spec number
    }
});
str = items.join("    ");    // join with whitespace again

现场版:http: //jsfiddle.net/Tys95/

于 2012-08-02T21:05:07.227 回答