这是我的输入文件是随机的,可以是任何数字,不仅仅是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
中看到一些东西然后开始格式化,删除我不需要的字符。
请问这里可能缺少什么?
答案 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。