Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用javascript查找和替换字符串中的2个整数_Javascript_Regex - Fatal编程技术网

如何用javascript查找和替换字符串中的2个整数

如何用javascript查找和替换字符串中的2个整数,javascript,regex,Javascript,Regex,我有一个字符串,比如:“总时间:3小时15分钟”,文本可以不同,但它总是有2个整数,总是按小时和分钟的顺序排列 然后,我根据字段和其他值计算新的小时/分钟,因此我必须更新旧字符串。javascript中匹配该字符串中的第一个和第二个整数并用新值替换它们的最佳方法是什么?尝试此方法以获得小时和分钟数 var str = 'Total time: 3 hours and 15 minutes'; var matches = str.match(/\d+/g); var number1 = Numbe

我有一个字符串,比如:“总时间:3小时15分钟”,文本可以不同,但它总是有2个整数,总是按小时和分钟的顺序排列


然后,我根据字段和其他值计算新的小时/分钟,因此我必须更新旧字符串。javascript中匹配该字符串中的第一个和第二个整数并用新值替换它们的最佳方法是什么?

尝试此方法以获得小时和分钟数

var str = 'Total time: 3 hours and 15 minutes';
var matches = str.match(/\d+/g);
var number1 = Number(matches[0]);
var number2 = Number(matches[1]);
str = str.replace(number1, '11').replace(number2, '22');
alert(str);
var pattern = /\d+/g;
var str = "Total time: 3 hours and 15 minutes";
var matches = str.match(pattern);
var hours = matches[0]; // will be 3
var minutes = matches[1]; // will be 15

试着用这个来获得小时和分钟

var pattern = /\d+/g;
var str = "Total time: 3 hours and 15 minutes";
var matches = str.match(pattern);
var hours = matches[0]; // will be 3
var minutes = matches[1]; // will be 15

您可以创建一个函数来更新字符串,如下所示:

var generateStr = function(hour, minute) {
    return 'Total Time: ' + hour + ' hours and ' + minute + ' minutes'
}

您可以创建一个函数来更新字符串,如下所示:

var generateStr = function(hour, minute) {
    return 'Total Time: ' + hour + ' hours and ' + minute + ' minutes'
}

使用正则表达式组,如下所示:

var inputStr = 'Total time: 3 hours and 15 minutes';
var newHours = 4;
var newMinutes = 30;
var outputStr = inputStr.replace(/(^.*?)(\d+)(.*?)(\d+)/,
   '$1' + newHours + '$3' + newMinutes);
现在,
outputStr
是“总时间:4小时30分钟”

编辑

您还可以执行以下操作:

var inputStr = 'Total time: 3 hours and 15 minutes';
var outputStr = inputStr.replace(/(^.*?)(\d+)(.*?)(\d+)/,
   function(match, p1, p2, p3, p4){
       p2 = parseInt(p2, 10) + 1;
       p4 = parseInt(p4, 10) + 10;
       return p1 + p2 + p3 + p4;
});

现在outputStr将是“总时间:4小时25分钟”

使用正则表达式组捕获如下内容:

var inputStr = 'Total time: 3 hours and 15 minutes';
var newHours = 4;
var newMinutes = 30;
var outputStr = inputStr.replace(/(^.*?)(\d+)(.*?)(\d+)/,
   '$1' + newHours + '$3' + newMinutes);
现在,
outputStr
是“总时间:4小时30分钟”

编辑

您还可以执行以下操作:

var inputStr = 'Total time: 3 hours and 15 minutes';
var outputStr = inputStr.replace(/(^.*?)(\d+)(.*?)(\d+)/,
   function(match, p1, p2, p3, p4){
       p2 = parseInt(p2, 10) + 1;
       p4 = parseInt(p4, 10) + 10;
       return p1 + p2 + p3 + p4;
});

现在outputStr将是“总时间:4小时25分钟”

此方法将保留原始字符串,允许编辑数字


此方法将保留原始字符串,允许编辑数字


您可以尝试以下操作:--


您可以尝试以下操作:--

什么是“最好的”?取决于你到底在做什么,以及你如何定义“最佳”,信息太少,无法回答

实现这一点的方法有很多。不知道你尝试了什么,或者你遇到了什么问题,你没有告诉我们

但也有一些可能性

Javascript

var str = 'Total time: 3 hours and 15 minutes',
    arr = str.split(/(\d+)/),
    addHours = 5,
    addMinutes = 30,
    result,
    idx;

arr[1] = +(arr[1]) + addHours;
arr[3] = +(arr[3]) + addMinutes;
result = arr.join('');
console.log(result);

idx = 0;
result = str.replace(/(\d+)/g, function (match, p1, offset, string) {
    idx += 1;
    if (idx === 1) {
        return +(p1) + addHours;
    }

    return +(p1) + addMinutes;
});

console.log(result);

result = str.match(/^(.*?)(\d+)(.*?)(\d+)(.*?)$/).slice(1).reduce(function (acc, cur, index) {
    if (index === 1) {
        acc += +(cur) + addHours;
    } else if (index === 3) {
        acc += +(cur) + addMinutes;
    } else {
        acc += cur;
    }

    return acc;
}, '');

console.log(result);

所有这些都会产生相同的结果。

什么是“最好的”?取决于你到底在做什么,以及你如何定义“最佳”,信息太少,无法回答

实现这一点的方法有很多。不知道你尝试了什么,或者你遇到了什么问题,你没有告诉我们

但也有一些可能性

Javascript

var str = 'Total time: 3 hours and 15 minutes',
    arr = str.split(/(\d+)/),
    addHours = 5,
    addMinutes = 30,
    result,
    idx;

arr[1] = +(arr[1]) + addHours;
arr[3] = +(arr[3]) + addMinutes;
result = arr.join('');
console.log(result);

idx = 0;
result = str.replace(/(\d+)/g, function (match, p1, offset, string) {
    idx += 1;
    if (idx === 1) {
        return +(p1) + addHours;
    }

    return +(p1) + addMinutes;
});

console.log(result);

result = str.match(/^(.*?)(\d+)(.*?)(\d+)(.*?)$/).slice(1).reduce(function (acc, cur, index) {
    if (index === 1) {
        acc += +(cur) + addHours;
    } else if (index === 3) {
        acc += +(cur) + addMinutes;
    } else {
        acc += cur;
    }

    return acc;
}, '');

console.log(result);


所有这些都会产生相同的结果。

我将基于原始字符串创建一个可重用的函数:

<div id="time">Total time: 3 hours and 15 minutes</div>
用法示例:

el.innerHTML = refresh.call([1, 2]); // "Total time: 1 hours and 2 minutes"
el.innerHTML = refresh.call([3, 4]); // "Total time: 3 hours and 4 minutes"
el.innerHTML = refresh.call({ hours: 1, minutes: 2 });
el.innerHTML = refresh.call({ hours: 3, minutes: 4 });
el.innerHTML = refresh({ hours: 1, minutes: 2 });
el.innerHTML = refresh({ hours: 3, minutes: 4 });

如果您不喜欢阵列:

var refresh = new Function('return [' + (
    el.innerHTML.replace(/'/g, '\\\'').replace(
        /^(\D+)\d+(\D+)\d+(.+)$/, 
        '\'$1\',this.hours,\'$2\',this.minutes,\'$3\''
    )
) + '].join(\'\');');
用法示例:

el.innerHTML = refresh.call([1, 2]); // "Total time: 1 hours and 2 minutes"
el.innerHTML = refresh.call([3, 4]); // "Total time: 3 hours and 4 minutes"
el.innerHTML = refresh.call({ hours: 1, minutes: 2 });
el.innerHTML = refresh.call({ hours: 3, minutes: 4 });
el.innerHTML = refresh({ hours: 1, minutes: 2 });
el.innerHTML = refresh({ hours: 3, minutes: 4 });

如果您不喜欢
.call()

用法示例:

el.innerHTML = refresh.call([1, 2]); // "Total time: 1 hours and 2 minutes"
el.innerHTML = refresh.call([3, 4]); // "Total time: 3 hours and 4 minutes"
el.innerHTML = refresh.call({ hours: 1, minutes: 2 });
el.innerHTML = refresh.call({ hours: 3, minutes: 4 });
el.innerHTML = refresh({ hours: 1, minutes: 2 });
el.innerHTML = refresh({ hours: 3, minutes: 4 });

进一步 演示:

refreshttime({小时:1,分钟:2});

我将基于原始字符串创建一个可重用函数:

<div id="time">Total time: 3 hours and 15 minutes</div>
用法示例:

el.innerHTML = refresh.call([1, 2]); // "Total time: 1 hours and 2 minutes"
el.innerHTML = refresh.call([3, 4]); // "Total time: 3 hours and 4 minutes"
el.innerHTML = refresh.call({ hours: 1, minutes: 2 });
el.innerHTML = refresh.call({ hours: 3, minutes: 4 });
el.innerHTML = refresh({ hours: 1, minutes: 2 });
el.innerHTML = refresh({ hours: 3, minutes: 4 });

如果您不喜欢阵列:

var refresh = new Function('return [' + (
    el.innerHTML.replace(/'/g, '\\\'').replace(
        /^(\D+)\d+(\D+)\d+(.+)$/, 
        '\'$1\',this.hours,\'$2\',this.minutes,\'$3\''
    )
) + '].join(\'\');');
用法示例:

el.innerHTML = refresh.call([1, 2]); // "Total time: 1 hours and 2 minutes"
el.innerHTML = refresh.call([3, 4]); // "Total time: 3 hours and 4 minutes"
el.innerHTML = refresh.call({ hours: 1, minutes: 2 });
el.innerHTML = refresh.call({ hours: 3, minutes: 4 });
el.innerHTML = refresh({ hours: 1, minutes: 2 });
el.innerHTML = refresh({ hours: 3, minutes: 4 });

如果您不喜欢
.call()

用法示例:

el.innerHTML = refresh.call([1, 2]); // "Total time: 1 hours and 2 minutes"
el.innerHTML = refresh.call([3, 4]); // "Total time: 3 hours and 4 minutes"
el.innerHTML = refresh.call({ hours: 1, minutes: 2 });
el.innerHTML = refresh.call({ hours: 3, minutes: 4 });
el.innerHTML = refresh({ hours: 1, minutes: 2 });
el.innerHTML = refresh({ hours: 3, minutes: 4 });

进一步 演示:

refreshttime({小时:1,分钟:2});

如果两个数字相同,情况如何?仅替换第一个实例(除非使用带有g标志的正则表达式)。因此,只要按正确的顺序更换(而且是),就没有问题。@jozxyqk:我按照“RobG”所述进行了测试,效果很好。:)感谢Robbt当第一个要更换的号码等于第二个原始号码时,会出现问题。例如:str=str.replace(数字1,'15')。replace(数字2,'22');这将返回“总时间:22小时和15分钟”,而不是“总时间:15小时和22分钟”@user3349897:这是我的错误。之前我把索引1和2放错了,而不是0和1。你能查一下我最新的答案吗。其中我有匹配项[0]和匹配项[1],而不是匹配项[1]和匹配项[2]。我相信这会解决你的问题。别忘了把它标记为一个答案,这样可以帮助其他开发人员。如果两个数字相同,情况会怎样?仅替换第一个实例(除非使用带有g标志的正则表达式)。因此,只要按正确的顺序更换(而且是),就没有问题。@jozxyqk:我按照“RobG”所述进行了测试,效果很好。:)感谢Robbt当第一个要更换的号码等于第二个原始号码时,会出现问题。例如:str=str.replace(数字1,'15')。replace(数字2,'22');这将返回“总时间:22小时和15分钟”,而不是“总时间:15小时和22分钟”@user3349897:这是我的错误。之前我把索引1和2放错了,而不是0和1。你能查一下我最新的答案吗。其中我有匹配项[0]和匹配项[1],而不是匹配项[1]和匹配项[2]。我相信这会解决你的问题。别忘了把它标记为一个答案,这样它可能会帮助其他开发人员。我理解OP是新值的计算需要知道当前值。因此,它们必须首先被提取,然后被替换。我理解OP是指计算新值时需要知道当前值。因此,它们必须首先被提取,然后被替换。