Я бы не использовал регулярные выражения для этого (хотя вы, конечно, можете);Я бы разделил строку на ::
, поскольку это концептуально то, что вы хотите сделать.
function lastToken(str) {
var xs = str.split('::');
return xs.length > 1 ? xs.pop() : null;
}
Если вы действительно хотите просто регулярное выражение, вы можете использовать /::((?:[^:]|:(?!:))*)$/
.Во-первых, он соответствует буквальному значению ::
.Затем мы используем скобки, чтобы поместить желаемую вещь в группу захвата 1. Желаемой вещью является одна или несколько копий строки, заключенной в скобки (?:...)
;это брекетинг групп без захвата.Затем мы ищем либо [^:]
, не двоеточие, либо :(?!:)
, двоеточие, за которым следует не двоеточие.(?!...)
является негативным прогнозом, который соответствует, только если следующий токен не не соответствует содержащемуся шаблону.Поскольку JavaScript не поддерживает отрицательные взгляды, я не вижу хорошего способа избежать захвата ::
, но вы можете заключить это в функцию:
function lastTokenRegex(str) {
var m = str.match(/::((?:[^:]|:(?!:))*)$/);
return m && m[1];
}