正则表达式模式结束子组

regex pattern ending sub group

我可以有以下字符串: 案例 1:

VIR RECU 998721687978
DE: Mrs PAUL SMITH
564
MOTIF: ANY REASON

或情况 2:

VIR RECU 998721687978
DE: Mrs PAUL SMITH
564

字符串中可能缺少 "MOTIF: ..." 部分

我正在寻找一个正则表达式来隔离 2 个先例的子字符串。 到目前为止,我有: ^VIR\sRECU\s(\d+)\nDE:\s(.*)(\nMOTIF:\s(.*)) 适用于案例 1 但不适用于案例 2。如果我在 'motif' 捕获组之后有一个问号,例如 ^VIR\sRECU\s(\d+)\nDE:\s(.*)(\nMOTIF:\s(.*))? 那么这个组是从未孤立

我想问题出在 (.*) 组,但不知道如何解决。

可能吗?或者我应该有 2 个不同的正则表达式,每个案例 1 个?

我在 php 上使用这些正则表达式和 preg_math() 函数。

我要的结果是998721687978Mrs PAUL SMITH 564ANY REASON

您可以使用

^VIR\s+RECU\s+(\d+)\nDE:\s+([\s\S]*?)(\nMOTIF:\s+(.*))?$

看到一个regex test #1 and a regex test #2

正则表达式详细信息

  • ^ - 字符串开头
  • VIR\s+RECU\s+ - VIR,1+ 个空格,RECU 和 1+ 个空格
  • (\d+) - 第 1 组:一个或多个数字
  • \nDE: - 一个换行符和 DE: 子串
  • \s+ - 1+ 个空格
  • ([\s\S]*?) - 第 2 组:任何 0+ 个字符,尽可能少
  • (\nMOTIF:\s+(.*))? - 一个可选的捕获组#3:
    • \nMOTIF: - 换行符和 MOTIF: 字符串
    • \s+ - 1+ 个空格
    • (.*) - 第 4 组:除换行字符外的任何 0+ 个字符,尽可能多
  • $ - 字符串结尾。