Ваше регулярное выражение
/(\d{1,4})\s?\|(\d{4,6})\s?\|(\d{3,4})/)
ищет дополнительное пространство, а затем трубу, т. Е. Должна быть труба для соответствия регулярному выражению.Если вам нужен либо пробел, либо пробел, используйте класс символов в скобках из двух [\s|]
:
/(\d{1,4})[\s|](\d{4,6})[\s|](\d{3,4})/)
Поскольку это класс символов в скобках, вам также не нужноэкранируйте символ трубы.
Обратите внимание, что ваш пример входных данных не соответствует регулярному выражению, которое вы разместили;в частности, ваши примеры не имеют префикса «cmd», и они начинаются только с одной ведущей цифры, а не со 2 по 4, как ожидает ваше регулярное выражение.Я настроил здесь регулярное выражение в соответствии с примером ввода.
robert@saaz:~$ echo 1 1111 123 | perl -ne 'print "matches\n" if (m/(\d{1,4})[\s|](\d{4,6})[\s|](\d{3,4})/);'
matches
robert@saaz:~$ echo '1|1111|123' | perl -ne 'print "matches\n" if (m/(\d{1,4})[\s|](\d{4,6})[\s|](\d{3,4})/);'
matches