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