The problem here is that the first one does not match because there is nothing after the e, thus it has to check for an e followed by something that isn't a letter or end of input. However, the third example doesn't work because in 2*e*e*2 the first match is *e*, thus both * are "consumed", so what's left of the string is only e*2. This obviously doesn't fix the problem.
What can be used in stead is a negative lookahead. They are written as a(?!b) in regex and (in this case) means an a not followed by a b. So we make the regex into ([^a-zA-Z])e(?![a-zA-Z). However, this still does not match the simple string e, because there is nothing in front of it. In something that's not JavaScript we could use a negative lookbehind, though js doesn't support this, so rather just change it to (^|[^a-zA-Z])e(?![a-zA-Z]).
The meaning is: Find any e that is at the beginning of the string, or after something that's not a-z or A-Z, and is not followed by an a-z or A-Z.
Here is working demo: http://regex101.com/r/wQ1oW3/3 (note, I replaced with <input> though, because it's simpler to see that the replacing is right.)
2ewill not work as there is nothing aftere.