- **Path patterns got a real syntax**, and a guide page to go with it: [Path Patterns](https://retentioneering.com/docs/path-patterns). One position can now be a [class of events](https://retentioneering.com/docs/path-patterns#the-tokens) instead of a single name — `[a|b|c]` (any of), `[^a]` / `[^a|b]` (anything but), `.` (any event) — which replaces the `rename_events` workaround for "any of these events", damaging the stream to ask one question. Quantifying a class with `*` turns it into a [restricted gap](https://retentioneering.com/docs/path-patterns#restricting-what-lies-between), a run of events like this rather than one: `add_to_cart->[^support_chat]*->purchase` is "bought without ever contacting support", `path_start->[^purchase]*->path_end` is "never purchased". `.*` is the unrestricted case of the same construct, so the two compose. Works everywhere a pattern is accepted — Step Matrix / Step Sankey / Transition Graph `path_pattern`, the `matches_pattern` metric, `truncate_paths` anchors. Details: the syntax follows Python's regular expressions with one substitution, a token is an event rather than a character, so negation lives *inside* the brackets (`[^a]`, never `^[a]`) and members are separated by `|`. A class occupies one position and one ordinal, so `at=` / `occurrence=` / Step Matrix centring are unaffected — centring on `[payment_error|checkout_bug]` behaves as centring on an event, except that column 0 shows a distribution over the class rather than one event at 1.0; a gap is not a position and takes no ordinal, so they are unaffected by that too. `.` and `[^...]` never match `path_start`/`path_end`, mirroring regex, where `.` does not match a string boundary — which is what makes `".->product_view"` mean "a product view that was not the path's first event", previously inexpressible. A restricted gap needs an anchor on each side, and [`^`/`$` are not anchors](https://retentioneering.com/docs/path-patterns#boundaries-are-not-events): a path's boundaries already have names. Constructs whose scope would exceed one position (`[^a->b]`, `a->b|c->d`, `[a|b]*`) are [rejected with an explanation](https://retentioneering.com/docs/path-patterns#what-is-not-supported) rather than half-supported
0 commit comments