Я бы не использовал регулярные выражения для этого (хотя вы, безусловно, можете); Я бы разделил строку на ::
, так как это концептуально то, что вы хотите сделать.
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];
}
в качестве разделителя, я хочу, чтобы все после того, как последний раздел «::» мог бы состоять в том, что после «::» у меня есть другой тип символа, числа и т. д. – jpabluz
Может ли последний токен содержать ':'? Если да, может ли это быть 'foo ::: bar', и как вы справитесь с этим? – Kobi