Zeichenketten mithilfe regulärer Ausdrücke zu prüfen, ist sehr rechenintensiv.
Reguläre Ausdrücke werden zu nicht-deterministischen endlichen Automaten kompiliert, dann in determinitische Automaten überführt und manchmal noch minimiert. Das ist komplexitätstheoretisch teuer, aber es gibt zwei Abers: Die schlechte Komplexitätsschranke der Transformation wird in der Praxis meist unterboten, man muss eher pathologische Beispiele konstruieren, um die Schranke wirklich auszureizen. Das zweite sehr viel größere Aber: Die Schranke ist abhängig von der Größe des regulären Ausdrucks, nicht von den Strings, die der reguläre Ausdruck schlussendlich erkennen soll. Das Wort-Problem für reguläre Ausdrücke ansich ist im Worstcase in Linearzeit lösbar. Das bedeutet auch, dass der Overhead für die Konstruktion des DFAs nur einmal vorab anfällt, egal wieviele Strings damit verglichen werden.
Soviel zur Effizienz (im theoretischen Sinne). Ob das von einem System auch performant gelöst ist, kommt ganz auf die Implementierung an, davon habe ich aber absolut keine Ahnung.
Sie sollten nur dann verwendet werden, wenn einfache Stringvergleiche nicht ausreichen.
Auch auf die Gefahr hin mich hier zu wiederholen: Performance-Optimierung sollte erst betrieben werden, wenn es schon zu spät ist. Optimierung auf Verdacht ist ineffizient, ineffektiv und im schlimmsten Fall sogar kontraproduktiv. Beim Schreiben von Code sollte immer zuerst die Lesbarkeit im Fokus stehen.