在记事本++中使用正则表达式替换数字递增的文本

时间:2018-07-13 17:24:56

标签: regex notepad++

示例字符串:

<TemperatureRange min="min3" max="max3" uom="uom13" code="1013" />
<TemperatureRange min="min4" max="max4" uom="uom13" code="1013" />

查找内容: <TemperatureRange min="min.*" max="max.*" u

替换为: <TemperatureRange min="10" max="10" u

输出:

<TemperatureRange min="10" max="10" uom="uom13" code="1013" />
<TemperatureRange min="10" max="10" uom="uom13" code="1013" />

预期输出:

<TemperatureRange min="10" max="10" uom="uom13" code="1013" />
<TemperatureRange min="11" max="11" uom="uom13" code="1013" />

2 个答案:

答案 0 :(得分:0)

由于您使用的是Notepad ++,因此我假设您拥有Powershell。

随意改进此处的代码,因为它可能不太高效,但是应该可以满足您的需求。我做到了,这样您甚至可以从最小和最大的不同数字开始。

function ReplaceFirstOccurrence ([string] $Source, [string]$Find, [string]$Replace)
{
    $Place = $Source.IndexOf($Find);

    $result = $Source.Remove($Place, $Find.Length).Insert($Place, $Replace);
    return $result;
}


$text = @"
<TemperatureRange min="min3" max="max3" uom="uom13" code="10131" />
<TemperatureRange min="min3" max="max3" uom="uom13" code="10132" />
<TemperatureRange min="min3" max="max3" uom="uom13" code="10133" />
<TemperatureRange min="min3" max="max3" uom="uom13" code="10134" />
"@
#alternatively, you can read text from file with Get-Content -Path c:\path\to\file.txt

$findWhat = @"
<TemperatureRange min="min.*" max="max.*" u
"@

$replaceWithTemplate = @"
<TemperatureRange min="{num1}" max="{num2}" u
"@

$startNums = @{}
$startNums["{num1}"] = 10
$startNums["{num2}"] = 10


$matches = [regex]::Matches($text, $findWhat)
$outputResult=$text

foreach ( $match in $matches){

    $replaceWith = $replaceWithTemplate 
    foreach($key in $($startNums.Keys))
    {
        $replaceWith = $replaceWith -replace $key,$startNums[$key]        
        $startNums[$key]++
    }

    $outputResult = ReplaceFirstOccurrence $outputResult $match.Value $replaceWith
}

$outputResult

结果是:

 <TemperatureRange min="10" max="10" uom="uom13" code="10131" />
 <TemperatureRange min="11" max="11" uom="uom13" code="10132" />
 <TemperatureRange min="12" max="12" uom="uom13" code="10133" />
 <TemperatureRange min="13" max="13" uom="uom13" code="10134" />

答案 1 :(得分:0)

如果您希望替换的行在一起,则可以执行以下操作:

替换为(无数字):

<TemperatureRange min="" max="" uom="uom13" code="1013" />

使用notepad ++的列编辑器(编辑=>列编辑器/ ALT + C)。这样您就可以用连续的数字填充列。

请参阅: Notepad++ sorting/replacing