【问题标题】:Not able to match multiline content in a SWIFT message (RegEx)无法匹配 SWIFT 消息中的多行内容 (RegEx)
【发布时间】:2018-09-14 18:10:26
【问题描述】:

我想使用 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 only。

我的 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】:

    在第三个捕获组中捕获的一种方法可能是使用[\s\S] 而不是点来匹配空白字符,并使用负前瞻(?! 断言右侧的内容与@987654325 不匹配@你在开始时尝试匹配的内容。

    请注意,您可以省略 {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 次数字后跟一个大写字符和一个冒号
        • ) 关闭负前瞻
      • )*关闭非捕获组并重复零次或多次
    • )关闭第三个捕获组

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

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

    Regex demo

    【讨论】:

    • 感谢您的回答,我会尝试一下。但是一条评论,(:{1,2}) 只匹配一个:。我按照你的建议做了,但它并不贪婪。
    • @Spurious 我明白你的意思,我会用交替更新答案。
    • @Spurious 我添加了一个更有效模式的更新。
    • 真的,非常感谢!我实际上并没有意识到未来的负面展望。关于更新模式的一条评论也与最后一个换行符匹配。
    • 我为 /// 添加了另一种模式,将它们分成不同的组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多