According to @Drew suggestion save-match-data give an all new match-data just as I wanted:
foo-bar-baz
(progn
(save-match-data
(goto-char (point-min))
(re-search-forward "^foo-\\(.*\\)-baz" nil t)
(message "step 1: %S" (match-string-no-properties 1)))
;; => step 1 : "bar"
(save-match-data
(goto-char (point-min))
(re-search-forward "^baz-\\(.*\\)-foo" nil t)
(message "step 2: %S" (match-string-no-properties 1)))
;; => step 2: no nil
)