Java 如果发生,如何匹配组强制?

Java 如果发生,如何匹配组强制?,java,regex,regex-group,Java,Regex,Regex Group,我有一根绳子 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+) 。我将组(?:new:\s*(ye

我有一根绳子

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+)


。我将组
(?:new:\s*(yes))?
设置为可选。但如果它发生,则不匹配。如果发生这种情况,如何匹配该组?有什么帮助吗?

您可以使用可选组包装点匹配图案,其中您需要匹配的组是强制性的:

当您将其设置为可选时,它只匹配一个空字符串,因此组为空。在
(?:*?新:\s*(yes))?
中,
*?
将尽可能少地匹配任何字符(每次跳过此模式并尝试
新:\s*(yes)
时,仅当不匹配时,
*?
才会展开)。由于
new:\s*(yes)
是必需的,因此将至少尝试一次,如果存在匹配的子字符串,则将捕获它

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