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