1

次の文字列があるとします: "a / b + c - e = d".

次のいずれかに一致させたい: +/-。ただし、 andよりも+優先したい、これらの文字が最初に見つかるように優先したい。通常の文字クラスでは、最初に一致させたいという事実にもかかわらず、気にせず、常に最初に一致します。-/-/[+-/]/+

1つの正規表現でこれを行うにはどうすればよいですか? 私の実際のユースケースには、それぞれ異なる優先順位で検索したい約10個のシンボルがあるため、ある程度保守可能なものが必要です。

4

1 に答える 1

4

正規表現はこれには適していないと思いますが、最終的にはある程度機能するようになりました。一連の代替がある場合、正規表現エンジンはそれらを順番に試します。

> /^(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]

ご覧のとおり、最初の選択肢である(.*)(\+)(.*). これを実際に使用する場合 (ただし、実際のレクサーとパーサーに移行してほしいと思います!)、左のワイルドカードまたは右のワイルドカードの貪欲さを明示的に減らして、結合性について明示できるようにすることをお勧めします。また、これは括弧で囲まれた用語を考慮していないことに注意してください。正規表現でそれを行うことさえできるかどうかはわかりません。

于 2013-10-20T00:51:41.577 に答える