在 Powershell 中使用 REGEX 解析 SWIFT(财务)消息字符串

Posted

技术标签:

【中文标题】在 Powershell 中使用 REGEX 解析 SWIFT(财务)消息字符串【英文标题】:Parse SWIFT(Financial) message string with REGEX in Powershell 【发布时间】:2022-01-07 06:54:31 【问题描述】:

我正在使用 Powershell 脚本将 SWIFT 消息(基于文本)解析到数据库中。我正在使用 REGEX 在文件中查找适当的字符串并提取它们。我现在遇到的问题是其中一个数据字段可以在字符串中包含 CR/LF 字符 - 在下面的示例中,我还需要提取第二行。

:61:2111261126D12000,00NTRF11000004217657P//03MT211124101166
JANE DOE  1232

我在 RegExr 中测试了这个正则表达式模式(:61:.*[\r\n].*),它认为[\r\n] 字符是有效的要求,所以我的计划是有两个表达式 - 一个有 CR/LF 字符,一个没有 CR/LF 字符来识别这两个消息 -有或没有换行符 - 但是下面的代码将返回所有匹配项,无论是否包含换行符 - 似乎 PS 在 CR/LF 之后停止评估字符串。

$transaction = $swift | select-string ‘:61:.*[\r\n].*’ -AllMatches  | %  $_.Matches  | %  $_.Value 

我可以使用 REGEX 来完成这项任务,还是必须创建一个函数来读取整个字符串并检查下一行标记以确定该字符串的结尾?

【问题讨论】:

$swift 是多行 string 还是 array$swift.GetType() => StringObject[]? 【参考方案1】:

更准确地描述第一行,那么剩下的必然是信息:

$swift = @'
:61:2111261126D12000,00NTRF11000004217657P//03MT211124101166
JANE DOE  1232
'@
$swift |Select-String -Pattern '(?m):\d+:[^,]+,[^/]+//\d+MT\d+[\s\r\n]+.*$'

正则表达式模式分解如下:

(?m)        # Multi-line mode, this will make `$` match end-of-line positions as well as end-of-string
:\d+:       # 1 or more digits, surrounded by colons,            matches `:61:`
[^,]+,      # 1 or more non-commas followed by a comma,          matches `2111261126D12000,`
[^/]+//     # 1 or more non-slashes, followed by 2,              matches `00NTRF11000004217657P//`
\d+MT\d+    # 1 or more digits followed by `MT` and more digits, matches `03MT211124101166`
[\s\r\n]+   # 1 or more white-space/CR/LF characters
.*$         # everything until the end of the current line,      matches `JANE DOE  1232`

由于我们使用[\s\r\n]+ 来描述潜在的换行符,当换行符被其他空白字符替换时,它仍然可以工作。

【讨论】:

以上是关于在 Powershell 中使用 REGEX 解析 SWIFT(财务)消息字符串的主要内容,如果未能解决你的问题,请参考以下文章

PowerShell Lookbehind 的 RegeX 代码在 IP 寻址上不匹配

如何在 RegEx 替换中将 RegEx 令牌传递给 PowerShell 子表达式?

powershell Powershell RegEx示例

powershell RegEx.Replace示例

PowerShell:按regex重命名目录项

用powershell中的regex替换子字符串