Why does this regex not work on linux?
I can't say it works on Windows but from my understanding this regex is correct and how I would write it (except maybe the ^
at the beginning)
From http://www.velocityreviews.com/forums/showpost.php?p=382944&postcount=3
^.+\.((jpg)|(gif)|(exe))$
When I run
find -regex '^.+\.((jpg)|(gif)|(exe))$'
my exe does not show up when i write
find -regex '^.+\.exe$'
It does. Why doesnt find -regex
want to use ()
or (()|())?
I always thought that was valid for everything.
GNU find by default uses emacs regular expressions, you can change that type with -regextype
option (see man find).
If you use -regextype posix-egrep
your expression seems to work. You could then also probably reduce the pattern to ^.+(jpg|gif|exe)$
With emacs: find . -regex '.+\(jpg\|gif\|exe\)$'
. See this section of emacs manual for those specific regex rules. You need to escape |
and ()
for them not to be literal.
In emacs regexps (
, |
and )
are literal unless escaped, this is exactly the opposite of all other regular expression formats.
Your expression works as ^.+\.\(jpg\|exe\|gif\)$
.