@@ -90,6 +90,7 @@ function parse (str, options) {
9090var optional = modifier === '?' || modifier === '*'
9191var pattern = capture || group
9292var delimiter = prev || defaultDelimiter
93+ var prevText = prev || ( typeof tokens [ tokens . length - 1 ] === 'string' ?tokens [ tokens . length - 1 ] :'' )
9394
9495tokens . push ( {
9596name :name || key ++ ,
@@ -99,7 +100,7 @@ function parse (str, options) {
99100repeat :repeat ,
100101pattern :pattern
101102 ?escapeGroup ( pattern )
102- :'[^' + escapeString ( delimiter === defaultDelimiter ? delimiter : ( delimiter + defaultDelimiter ) ) + ']+?'
103+ :restrictBacktrack ( delimiter , defaultDelimiter , prevText )
103104} )
104105}
105106
@@ -111,6 +112,16 @@ function parse (str, options) {
111112return tokens
112113}
113114
115+ function restrictBacktrack ( delimiter , defaultDelimiter , prevText ) {
116+ var charGroup = '[^' + escapeString ( delimiter === defaultDelimiter ?delimiter :( delimiter + defaultDelimiter ) ) + ']'
117+
118+ if ( ! prevText || prevText . indexOf ( delimiter ) > - 1 || prevText . indexOf ( defaultDelimiter ) > - 1 ) {
119+ return charGroup + '+?'
120+ }
121+
122+ return escapeString ( prevText ) + '|(?:(?!' + escapeString ( prevText ) + ')' + charGroup + ')+?'
123+ }
124+
114125/**
115126 * Compile a string to a template function for the path.
116127 *