Это потому что вы используете \d с * .
Когда у вас есть [a-z]|\d* , он сначала попытается найти совпадение с a-z . Если нет, он будет пытаться сопоставить 0 или более повторений цифры. В вашем примере, это будет соответствовать первому.
Однако, наоборот, сначала он попытается сопоставить 0 или более повторений цифры. Ну, a это 0 повторений цифры, так что это квалифицируется как «совпадение». Он не будет пытаться оценить выражение [a-z] , так как он уже квалифицирован для 0 повторений.
Чтобы правильно использовать этот шаблон (особенно если он должен быть буквой или хотя бы одной цифрой), вы можете вместо этого использовать:
[a-z]|\d+ или \d+|[a-z]
Это будет искать 1 или более повторений цифры, не найдет совпадения на a , а затем оценит [a-z] , что приведет к ожидаемому ответу.