在PowerShell

时间:2017-03-28 18:08:08

标签: regex powershell search match

这是我的输入文件是随机的,可以是任何数字,不仅仅是9999和任何字母: 以下格式将始终位于-(破折号)之后。

-
9999 99AKDSLY9ZWSRK99999
9999 99BGRPOE99FTRQ99999

预期产出:

AKDSLY9ZSRK
BGRPOE99TRQ

所以我需要删除每一行的第一部分,总是数字:

9999 99
9999 99

然后删除不需要的字符:

99AKDSLY9ZW→在这种情况下是W,但可以是任何字母
99BGRPOE99F→在这种情况下是F,但可以是任何字母

最后删除最后5位数字,总是数字:

99999
99999

我正在尝试使用的是正则表达式(第一次使用它):

$result = [regex]::Matches($InputFile, '(^\d{4}\s\d{2}[A-Z0-9]\d{5}$)') -replace '\d{4}\s\d{2}', '')
$result

它没有给我一个错误信息,但它没有向我显示我期望在$result看到的字符。

我希望在$result中看到一些东西然后开始格式化,删除我不需要的字符。

请问这里可能缺少什么?

1 个答案:

答案 0 :(得分:1)

尝试这样的事情:

$str = (Get-Content ... -Raw) -replace '\r'

$cb = {
  $args[0].Groups[1].Value -replace '(?m)^.{7}' -replace '(?m).(.{3}).{5}$', '$1'
}

$re = [regex]'(?m)^(?<=-\n)((?:\d{4}\s\d{2}[^\n]*\d{5}(?:\n|$))+)'

$re.Replace($str, $cb)

正则表达式$re匹配以连字符和换行符开头的多行子字符串,后跟一行或多行数字/字母组合。 (?<=...)是一个积极的lookbehind断言,以确保只有当带有数字/字母组合的行前面带有连字符的行(不将该行作为实际匹配的一部分)时才能获得匹配。

scriptblock $cb是一个匿名回调函数,Regex.Replace()方法调用每个匹配。对于匹配中的每一行,它从行的开头删除前7个字符,并将该行末尾的最后9个字符替换为这些字符的第2到第4个字符。

为简单起见,示例代码从字符串中删除回车符(CR,\r),以便所有换行符都是换行符(LF,\n)而不是默认的CR-LF。