Номер, не содержащий цифру 5 - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь использовать отрицательный прогноз в соответствии с этим ответом , чтобы сопоставить числа, не содержащие цифру 5:

echo "aaa 123467890 3456 bbb" | egrep '[(?!5)[:digit:]]+'

Вывод цвета показывает, что второе число соответствует. Как это исправить?

Есть ли способ с egrep исключить 5 из класса [:digit:]? (Я выполнил несколько поисков, но не смог ничего найти для этого)

1 Ответ

0 голосов
/ 12 сентября 2018

Есть две проблемы с вашим регулярным выражением:

  1. egrep (как в расширенных регулярных выражениях POSIX) вообще не поддерживает прогнозирование или прогнозирование.
  2. Даже если это так, [(?!5)[:digit:]] является классом из одного символа, эквивалентным [[:digit:]()!?]. ( не имеет особого значения в классе символов.

К сожалению, egrep также не поддерживает отрицательные именованные классы символов (как в [[:^digit:]]).

Это оставляет вам только два варианта:

  • Вручную вычислить разность наборов и перечислить ее явно:

    egrep '[0-46-9]+'
    
  • Переключитесь на PCRE и используйте регулярное выражение в стиле Perl, либо

    grep -P '[^\D5]+'
    

    (трюк, использующий двойное отрицание и объединение множеств для вычисления разности множеств: мы сопоставляем любой символ, который не является нецифровым или 5), или

    grep -P '(?:(?!5)\d)+'
    

    (предварительная версия, исправлено).

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