发生组必填怎么匹配?

How to match group compulsory if it occurs?

我有一个字符串

Name: abc
        No:  1234
new: yes
DOB:    06-07-1992
     sal:  40000

在这个字符串中,我要匹配名字、dob、no和sal。

有新的就匹配,否则不用匹配。我试过正则表达式,
(?:name:\s*(\S+)).*?(?:no:\s*(\d+)).*?(?:new:\s*(yes))?.*?(?:dob:\s*(\d{2}-\d{2}-\d{4})).*(?:sal:\s*(\d+))

Regex。我将组 (?:new:\s*(yes))? 设为可选。但是如果发生了就不匹配了。如果发生强制性,如何匹配该组?有帮助吗?

你可以用一个可选的组来包装点匹配模式,其中你需要匹配的组是必需的:

name:\s*(\S+).*?no:\s*(\d+)(?:.*?new:\s*(yes))?.*?dob:\s*(\d{2}-\d{2}-\d{4}).*sal:\s*(\d+)
                           ^^^^^^^^^^^^^^^^^^^^

regex demo

当您将其设为可选时,它只匹配一个空字符串,因此该组为空。在(?:.*?new:\s*(yes))?中,.*?将匹配尽可能少的任何字符(每次跳过此模式并尝试new:\s*(yes),只有在不匹配时,.*? 展开)。而且由于new:\s*(yes)是必须的,所以至少会尝试一次,如果匹配的子串存在,就会被捕获。