Вы можете обернуть шаблон сопоставления точек с дополнительной группой, в которой создана группа, с которой вам нужно сопоставить обязательно :
name:\s*(\S+).*?no:\s*(\d+)(?:.*?new:\s*(yes))?.*?dob:\s*(\d{2}-\d{2}-\d{4}).*sal:\s*(\d+)
^^^^^^^^^^^^^^^^^^^^
См. Демонстрационный пример regex
когда вы сделали его необязательным, он просто соответствовал пустой строке и, таким образом, группа была пустой.В (?:.*?new:\s*(yes))?
, .*?
будет соответствовать любым символам как можно меньше (каждый раз, когда этот шаблон пропускается и new:\s*(yes)
пробуется, и только когда он не совпадает, .*?
расширяется).И поскольку new:\s*(yes)
является обязательным, оно будет пробоваться хотя бы один раз, и если соответствующая подстрока присутствует, она будет захвачена.