正規表現はこれには適していないと思いますが、最終的にはある程度機能するようになりました。一連の代替がある場合、正規表現エンジンはそれらを順番に試します。
> /^(h|hello)(.*)$/.exec("hello")
["hello", "h", "ello"]
これにより、ある種の優先順位を設定できますが、正規表現エンジンが最初の一致の検索を停止するため、一見すると機能しません。
代わりにできることは、次のように、各代替が文字列全体に一致する正規表現を作成することです。
> /^(.*)(\+)(.*)$|^(.*)(-)(.*)$|^(.*)(\/)(.*)$/.exec("a / b + c - e = d")
["a / b + c - e = d", "a / b ", "+", " c - e = d", undefined, undefined, undefined, undefined, undefined, undefined]
ご覧のとおり、最初の選択肢である(.*)(\+)(.*)
. これを実際に使用する場合 (ただし、実際のレクサーとパーサーに移行してほしいと思います!)、左のワイルドカードまたは右のワイルドカードの貪欲さを明示的に減らして、結合性について明示できるようにすることをお勧めします。また、これは括弧で囲まれた用語を考慮していないことに注意してください。正規表現でそれを行うことさえできるかどうかはわかりません。