Во-первых, ваше регулярное выражение даже не соответствует тому, что вы пытаетесь заменить, потому что вы избежали a
в amount
:
\b(Total\s\amount\s\$)(\d?\d?\d?...
# ^^
\a
- это escape-последовательность , которая соответствует символу "будильник" или "звонок" \u0007
.
Кроме того, если вы хотите вычислить сумму двух захватов, вам необходимо сначала преобразовать их в числовые значения, в противном случае оператор +
просто объединит две строки.
$Total = $Match.Groups[2].Value
$Change = $Match.Groups[4].Value
$Sumtotal = $Total + $Change # gives 11.390.21
$Sumtotal = [double]$Total + [double]$Change # gives 11.6
И вам нужно построить $Result
после того, как вы определили другие переменные, иначе функция замены просто вернет пустую строку.
Изменить это:
$RegexPattern = '\b(<b><i>Total\s\amount</i></b>\s\$)(\d?\d?\d?\d?\d\.?\d?\d?)(\s\|\sChange\s\$)(\d?\d?\d\.?\d?\d?)\b'
$Substitution = {
param ($Match)
<b><i>$Result = $GP1 + $Sumtotal + $GP3 + $Change</i></b>
$GP1 = $Match.Groups[1].Value
$Total = $Match.Groups[2].Value
$GP3 = $Match.Groups[3].Value
$Change = $Match.Groups[4].Value
$Sumtotal = ($Total + $Change)
return [string]$Result
}
в это:
$RegexPattern = '\b(<b><i>Total\samount</i></b>\s\$)(\d?\d?\d?\d?\d\.?\d?\d?)(\s\|\sChange\s\$)(\d?\d?\d\.?\d?\d?)\b'
$Substitution = {
Param($Match)
$GP1 = $Match.Groups[1].Value
$Total = [double]$Match.Groups[2].Value
$GP3 = $Match.Groups[3].Value
$Change = [double]$Match.Groups[4].Value
$Sumtotal = ($Total + $Change)
<b><i>$Result = $GP1 + $Sumtotal + $GP3 + $Change</i></b>
return [string]$Result
}
и код будет в основном делать то, что вы хотите. «В основном», потому что он не будет форматировать вычисленное число до двойных десятичных знаков. Вы должны сделать это самостоятельно. Используйте оператор формата (-f
) и измените функцию замены на что-то вроде этого:
$Substitution = {
Param($Match)
$GP1 = $Match.Groups[1].Value
$Total = [double]$Match.Groups[2].Value
$GP3 = $Match.Groups[3].Value
$Change = [double]$Match.Groups[4].Value
$Sumtotal = $Total + $Change
return ('{0}{1:n2}{2}{3:n2}' -f $GP1, $Sumtotal, $GP3, $Change)
}
В качестве примечания: подвыражение \d?\d?\d?\d?\d\.?\d?\d?
может быть сокращено до \d+(?:\.\d+)?
(одна или несколько цифр, необязательно с точкой и одной или несколькими цифрами) или, точнее, до \d{1,4}(?:\.\d{0,2})?
(одно до четырех цифр, необязательно с точкой и до 2 цифр).