The Bash shell provides extglob option for advanced pattern matching of filenames. These will help you apply regexp like quantifiers, provide alternate patterns and negation. From man bash:

Extended globDescription
?(pattern-list)Matches zero or one occurrence of the given patterns
*(pattern-list)Matches zero or more occurrences of the given patterns
+(pattern-list)Matches one or more occurrences of the given patterns
@(pattern-list)Matches one of the given patterns
!(pattern-list)Matches anything except one of the given patterns

Extended globs are disabled by default. You can use shopt -s extglob and shopt -u extglob to set and unset this option respectively.

Here are some examples (visit to get the script used below).

$ source
$ ls   f1.txt      f4.txt   math.h         report-02.log
42.txt   f2_old.txt  f7.txt    ip.txt  notes.txt      report-04.log  f2.txt  main.c  report-00.log  report-98.log

# one or more digits followed by '.' and then zero or more characters
$ ls +([0-9]).*  42.txt

# same as: ls *.c *.sh
$ ls *.@(c|sh)  main.c

# not ending with '.txt'
$ ls !(*.txt)  main.c  report-00.log  report-04.log     math.h  report-02.log  report-98.log

# not ending with '.txt' or '.log'
$ ls *.!(txt|log)  main.c  math.h

Video demo:

info See also my Linux Command Line Computing ebook.