我有一个字符串
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))?
设为可选。但是,如果发生,则不匹配。如果发生这种情况,该如何匹配该团体必修课?有帮助吗?
答案 0 :(得分:1)
您可以使用一个可选的组将点匹配模式包装起来,在该组中,您需要匹配的组被设置为必须:
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)
时,只有在不匹配时,{{1} })。并且由于.*?
是强制性的,因此将至少尝试一次,并且如果存在匹配的子字符串,它将被捕获。