我想使用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]
而不是点来匹配空白字符并使用负向前瞻(?!
来断言右侧的内容与:[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])
在第一个捕获组中匹配一个数字,然后是一个大写字符(::|:)
在第二个捕获组中捕获两次或一次结肠(
开始第三次捕获组
(?:
非捕获组
[\s\S]
匹配任何字符,包括空格字符
(?!:
负面预测断言右边的东西不是
[0-9]{2}[A-Z]:
在第一个捕获组中匹配一个数字,然后是大写字符和冒号
)
关闭否定前瞻
)*
关闭非捕获组并重复零次或多次)
关闭第三个捕获组更新:使用点的上述正则表达式的更高效版本。这将使模式与开头的冒号匹配,然后匹配任何字符,直到字符串的末尾,并带有可选的换行符。那么我们将是一个负面的先行,以断言匹配不是冒号的部分,并以重复模式匹配整行。
:([0-9]{2}[A-Z])(::|:)(.*(?:\r?\n)?(?:(?!:[0-9]{2}[A-Z]:).*(?:\r?\n)?)*)