首页 > 解决方案 > 无法匹配 SWIFT 消息中的多行内容 (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 不起作用,我正在尝试调试但找不到解决方案。这是正则表达式:/:([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

标签: javascriptregexmultiline

解决方案


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

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

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

正则表达式演示

解释

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

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

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

正则表达式演示


推荐阅读