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

问题描述 投票:0回答:1

我想使用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
javascript regex multiline
1个回答
1
投票

在第三个捕获组中捕获的一种方法可能是使用[\s\S]而不是点来匹配空白字符并使用负向前瞻(?!来断言右侧的内容与:[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])在第一个捕获组中匹配一个数字,然后是一个大写字符
  • (::|:)在第二个捕获组中捕获两次或一次结肠
  • (开始第三次捕获组 (?:非捕获组 [\s\S]匹配任何字符,包括空格字符 (?!:负面预测断言右边的东西不是 [0-9]{2}[A-Z]:在第一个捕获组中匹配一个数字,然后是大写字符和冒号 )关闭否定前瞻 )*关闭非捕获组并重复零次或多次
  • )关闭第三个捕获组

更新:使用点的上述正则表达式的更高效版本。这将使模式与开头的冒号匹配,然后匹配任何字符,直到字符串的末尾,并带有可选的换行符。那么我们将是一个负面的先行,以断言匹配不是冒号的部分,并以重复模式匹配整行。

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

Regex demo

© www.soinside.com 2019 - 2024. All rights reserved.