Поскольку в примерах показано пространство между двумя словами (идентификатор продукта и информация о версии), я хотел бы разработать регулярное выражение, которое использует это пространство для разделения частей. В Perl:
$line =~ s/^(A\S+)\s+ver\.\s?\d{1,2}/$1/;
Это удаляет (без захвата) версию; если версия отсутствует, то замена ничего не делает.
$line =~ s/^(A\S+)(?:\s+(ver\.\s?\d{1,2}))?/$1/;
Это почти тривиальное изменение идеи; он захватывает строку версии, если она присутствует (а также заменяет и т. д.) Обратите внимание на тонкость, заключающуюся в том, что пробел перед строкой версии включен в необязательный материал, но не записан '(?:...)?
', но информация о версии записывается без начальных пробелов.
Цитируя регулярные выражения в аннотации, не привязывая их к контексту Perl (хотя они все еще используют PCRE - совместимое с Perl регулярное выражение - нотация), вы могли бы написать:
^(A\S+)(?:\s+(ver\.\s?\d{1,2}))?