javascript - 无法匹配 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
解决方案
在第三个捕获组中捕获的一种方法可能是使用[\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)?)*)