无法匹配 SWIFT 消息中的多行内容 (RegEx)

Not able to match multiline content in a SWIFT message (RegEx)

我想使用 RegEx 查看 SWIFT 消息。我有以下摘录:

:16R:FIN
:35B:ISIN CH0117044708
ANTEILE -DT USD- SWISSCANTO (CH)
INDEX FUND V - SWISSCANTO (CH)
INDEX EQUITY FUND USA
:16R:FIA

我正在尝试将完整信息放入第 3 组:

ISIN CH0117044708
ANTEILE -DT USD- SWISSCANTO (CH)
INDEX FUND V - SWISSCANTO (CH)
INDEX EQUITY FUND USA

相反,我只得到:ISIN CH0117044708

我的 RegEx 不工作,我正在尝试调试但找不到解决方案。这是 RegEx 表达式:/:([0-9]{2}[A-Z]){1}(::|:)((.*\r\n){1,4}|.*)/gm

在这里玩一玩: https://regex101.com/r/qX9cET/2

编辑: 我们将如何去匹配这个模式(可选): ([A-Z]*)(?:\/\/)?(.*(?:\/)?){0,2}

包含在旧的(https://regex101.com/r/Ubci69/5)中:

:16R:FIN
:97A::SAFE//0123-456789-11-020
:35B:ISIN CH0117044708
ANTEILE -DT USD- SWISSCANTO (CH)
INDEX FUND V - SWISSCANTO (CH)
INDEX EQUITY FUND USA
:16R:FIA
:93B::AGGR//UNIT/0,117
:19A::HOLD//CHF237,15
:92B::EXCH//JPY/CHF/0,0087535442107

在第三个捕获组中捕获的一种方法可能是使用 [\s\S] 而不是点来匹配空白字符,并使用否定前瞻 (?! 来断言右边的内容side 不匹配 :[0-9]{2}[A-Z]:{1,2} 你在开头尝试匹配的内容。

请注意,您可以省略 {1},如果您不使用第一个和第二个捕获组,则可以省略它们以仅在第一个捕获组中获取您的值。

:([0-9]{2}[A-Z])(::|:)((?:[\s\S](?!:[0-9]{2}[A-Z]:))*)

Regex Demo

说明

  • :字面匹配
  • ([0-9]{2}[A-Z]) 在第一个捕获组中匹配 2 次数字后跟大写字符
  • (::|:) 在第二个捕获组中捕获两次或一次冒号
  • (开始第三个捕获组
    • (?:非捕获组
      • [\s\S] 匹配任何字符,包括空白字符
      • (?!: 断言右侧内容的否定前瞻
        • [0-9]{2}[A-Z]: 在第一个捕获组中匹配 2 次数字后跟一个大写字符和一个冒号
      • ) 关闭否定前瞻
    • )*关闭非捕获组并重复零次或多次
  • )关闭第三个捕获组

Update:使用点的上述正则表达式的更高效版本。这会将模式与开头的冒号匹配,然后匹配任何字符,直到字符串的末尾,并带有可选的换行符。然后它会使用一个否定的前瞻来断言不匹配带有冒号的部分并以重复模式匹配整行。

:([0-9]{2}[A-Z])(::|:)(.*(?:\r?\n)?(?:(?!:[0-9]{2}[A-Z]:).*(?:\r?\n)?)*)

Regex demo