И @ slavy13, и @dreftymac дают вам базовое решение с указателями, но ...
- Вы можете использовать
\d
внутри класса символов для обозначения цифры.
- Вам не нужно ставить пробел в класс символов, чтобы соответствовать его (за исключением, возможно, для ясности, хотя это спорно).
- Вы можете использовать
[:alpha:]
внутри класса символов для обозначения буквенного символа, [:digit:]
для обозначения цифры и [:alnum:]
для обозначения буквенно-цифровых символов (особенно без подчеркивания, в отличие от \w
). Обратите внимание, что эти классы символов могут означать больше символов, чем вы ожидаете; Вспомните акцентированные символы и неарабские цифры, особенно в Unicode.
- Если вы хотите получить всю информацию после пробела, вам нужно повторить ее в скобках.
Сравните поведение этих двух однострочников:
perl -n -e 'print "$2\n" if m/\bI( {1,2})([a-zA-Z\d\\]){2,13}\b/'
perl -n -e 'print "$2\n" if m/\bI( {1,2})([a-zA-Z\d\\]{2,13})\b/'
Учитывая строку ввода "I a123
", первая печатает "3", а вторая печатает "a123". Очевидно, что если вам нужен только последний символ второй части строки, то с исходным выражением все в порядке. Однако это вряд ли будет требованием. (Очевидно, что если вас интересует только вся партия, то использование '$&
' даст вам соответствующий текст, но это отрицательно скажется на эффективности.)
Я бы, наверное, использовал это регулярное выражение, как мне кажется:
m/\bI( {1,2})([[:alnum:]\\]{2,13})\b/
Время для обязательного штекера: прочитайте Джеффа Фридла " Освоение регулярных выражений ".