Разделить строку из 2 слов на отдельные слова [но иногда в строке есть только слово ...] - PullRequest
2 голосов
/ 10 октября 2010

У меня есть строки типа "AMS.I-I.D. ver.5" и "AM0011 ver. 2", из которых "ver. *" необходимо удалить.Я сделал это с: (^A.*)(ver.\s\d{1,2})

Проблема возникает, когда нет номера версии, например "AM0003".Как я могу сделать деталь (ver.\s\d{1,2}) опциональной?

Ответы [ 3 ]

6 голосов
/ 10 октября 2010

Причина, по которой это не работает при добавлении знака вопроса, заключается в том, что ваша первая группа соответствует жадно .Попробуйте изменить его на не жадное соответствие, а затем сделать вторую группу необязательной:

^(A.*?)(ver\.\s\d{1,2})?$
     ^                 ^
 non-greedy        optional

Обратите внимание, что в обеих частях единственным изменением является добавление знака вопроса, но знак вопроса имеет другое значениекаждый случай.

Кроме того, в одном из ваших примеров нет пробела между текстом ver. и номером версии, поэтому вы должны рассмотреть вопрос о том, чтобы сделать пробел необязательным в своем регулярном выражении.регулярное выражение в действии на Rubular .

0 голосов
/ 10 октября 2010

Поскольку в примерах показано пространство между двумя словами (идентификатор продукта и информация о версии), я хотел бы разработать регулярное выражение, которое использует это пространство для разделения частей. В 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}))?
0 голосов
/ 10 октября 2010

Чтобы получить дополнительный захват с помощью регулярных выражений, достаточно использовать оператор ?.

(^A.*)(ver\.\s\d{1,2})?

Ресурсы:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...