Между номером 6-ди git и номером телефона может быть метка, поэтому вам необходимо учесть это и как-то потреблять. Один из примеров для этого - позволить любому персонажу быть там, где это необязательно, это не знак +
, например:
[^+]*
В контексте вашего регулярного выражения это делает:
(.+?)\s*(\d+.*Singapore\s+\d{6}\b|\d+.*S\d{6})\b(?!(\.+?)\s*)[^+]*(\+65[\d ]*)
Какой теперь соответствует во всех трех случаях.
Редактировать:
На основании обновлений я изменил регулярное выражение * соответствует всем шести случаям :
(.+?)\s*(\d+.*?Singapore\s+\d{6}\b|\d+.*?S\d{6})\b[^+0-9]*((?:\+65)?[\d ]*)