В вашем паттерне [^&]_*\s*(SF)*\d{8}
вы не соответствует амперсанду [^&]
, 0+ раз _
, 0+ раз символ пробела и захватываете в повторяющейся группе 0+ раз, соответствующей SF. Затем шаблон заканчивается сопоставлением 8 цифр.
Это означает, что существует множество «необязательных» частей, которые могут соответствовать 0+ раз.
Вы получаете совпадение, потому что [^&]
может совпадать с F
, тогда _*\s*(SF)*
необязательно, но \s*
может совпадать с пробелом, и тогда могут совпадать 8 цифр.
Вы можете обновить свой шаблон, удалив квантификатор из группы и сопоставив \s
и _
в классе символов [\s_]
[^&][\s_](SF) \d{8}
Regex demo
Если вы просто хотите сопоставить 8 цифр с префиксом SF и пробелом, вы можете использовать регистр без учета регистра и использовать:
(sf) \d{8}
Regex demo