我想对字符串中的数字执行算术运算。
例如:const getEmployeeStartLeave = value => {
let employeeLeaves = [...isEmployeeLeave];
const calendarDates = value.toString();
const formatCalendarDates = moment(calendarDates).format('YYYY-MM-DD');
const filteredData = [].concat
.apply([], employeeLeaves)
.filter(item => item.startDate === formatCalendarDates);
return filteredData;
};
应该变成SGJKR67
。
另一个:SGJKR68
应该变成NYSC34
。
仅数字更改,在此示例中,两个数字均增加一个。
答案 0 :(得分:1)
使用正则表达式和捕获组可以解决您的问题:
$reg = [regex]::new("([A-Z]+)(\d+)")
$m = $reg.Match("SGJKR67")
$digits = $m.Groups[2] # will be 67
$digits = $digit + 1; # or apply anything you want
$result = "$($m.Groups[1])$digits" # will be SGJKR and 68.
您将有3组符合您的比赛条件:
答案 1 :(得分:1)
在PowerShell Core (v6.1 +)中,您可以使用-replace
operator:
\d+
是一个或多个(+
)位数字(\d
)的序列和script block ({ ... }
)作为替换操作数,它使您可以根据每次匹配动态确定替换字符串:
$_
包含一个[System.Text.RegularExpressions.Match]
实例,其中包含有关比赛的信息;在最简单的情况下,$_.Value
返回匹配的文本。PS> 'SGJKR67', 'NYSC34' -replace '\d+', { 1 + [int] $_.Value }
SGJKR68
NYSC35
在不支持脚本块替换操作数的 Windows PowerShell 中,必须使用.NET [regex]
类型的静态.Replace()
method直接:
PS> 'SGJKR67', 'NYSC34' | ForEach-Object {
[regex]::Replace($_, '\d+', { param($m) 1 + [int] $m.Value })
}
SGJKR68
NYSC35
注意:与-replace
不同,[regex]::Match()
不支持传递输入字符串的 array ,因此使用ForEach-Object
调用;在 脚本块({ ... }
中,$_
指的是手边的输入字符串。
除了在手边的匹配([System.Text.RegularExpressions.Match]
实例)作为 argument 传递到脚本块(其参数声明为param($m)
)之外,方法基本相同。捕获变量$m
。
答案 2 :(得分:0)
您必须将数字与字符串分开,计算新数字并将所有内容返回为字符串。
[System.String]$NumberInString = 'SGJKR68'
[System.String]$String = $NumberInString.Substring(0, 5)
[System.Int32]$Int = $NumberInString.Substring(5, 2)
$Int += 1
[System.String]$NewNumberInString = ($String + $Int)
$NewNumberInString