Подтвердить что ты не робот

Как совместить цифры в регулярном выражении

Я пытаюсь сопоставить некоторые строки с регулярным выражением, содержащим цифры.

Bash версия 3.2.25:

#!/bin/bash

s="AAA (bbb 123) CCC"
regex="AAA \(bbb \d+\) CCC"
if [[ $s =~ $regex ]]; then
  echo $s matches $regex
else
  echo $s doesnt match $regex
fi

Результат:

AAA (bbb 123) CCC doesnt match AAA \(bbb \d+\) CCC

Если я положил regex="AAA \(bbb .+\) CCC", он работает, но он не соответствует моему требованию, чтобы соответствовать только цифрам.

Почему \d+ не соответствует 123?

4b9b3361

Ответ 1

Используйте стандартный набор символов или POSIX-совместимую нотацию:

[0-9]    
[[:digit:]]    

Как прочитано в Поиск только чисел в начале имени файла с регулярным выражением:

\d и \w не работают в регулярных выражениях POSIX, вы можете использовать [:digit:] хотя

поэтому ваше выражение должно быть одним из следующих:

regex="AAA \(bbb [0-9]+\) CCC"
#                ^^^^^^
regex="AAA \(bbb [[:digit:]]+\) CCC"
#                ^^^^^^^^^^^^

Все вместе, ваш script может быть следующим:

#!/bin/bash

s="AAA (bbb 123) CCC"
regex="AAA \(bbb [[:digit:]]+\) CCC"
if [[ $s =~ $regex ]]; then
  echo "$s matches $regex"
else
  echo "$s doesn't match $regex"
fi

Пусть запустите его:

$ ./digits.sh
AAA (bbb 123) CCC matches AAA \(bbb [[:digit:]]+\) CCC

Ответ 2

Цифровая нотация \d не работает с вашей версией bash. Вместо этого используйте [0-9]:

regex="AAA \(bbb [0-9]+\) CCC"