Regex для поиска последнего токена в строке - PullRequest
1 голос
/ 14 декабря 2010

Мне было интересно, есть ли способ получить это

var string = "foo::bar"

Чтобы получить последнюю часть строки: "bar" используя просто регулярное выражение.

Я пытался сделать взгляд-перед, но не смог освоить их достаточно, чтобы сделать это.

-

ОБНОВЛЕНИЕ

Возможно, некоторые примеры прояснят вопрос.

var st1 = "foo::bar::0"
match should be 0

var st2 = "foo::bar::0-3aab"
match should be 0-3aab

var st3 = "foo"
no match should be found

Ответы [ 4 ]

8 голосов
/ 14 декабря 2010

Вы можете использовать отрицательный взгляд:

/::(?!.*::)(.*)$/

Результат будет в захвате.

Другой подход:

/^.*::(.*)$/

Это должно работать, потому что .* соответствует жадно, поэтому :: будет соответствовать последнему вхождению этой строки.

2 голосов
/ 14 декабря 2010

Просто

/::(.+)$/

Вы не можете использовать lookaheads, если не знаете точно, какую длину строки вы пытаетесь сопоставить. К счастью, это не проблема, потому что вы смотрите только на конец строки $.

1 голос
/ 15 декабря 2010

Я бы не использовал регулярные выражения для этого (хотя вы, конечно, можете);Я бы разделил строку на ::, поскольку это концептуально то, что вы хотите сделать.

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];
}
0 голосов
/ 14 декабря 2010
var string2 = string.replace(/.*::/, "");

хотя, возможно, string не лучший выбор имени для вашей строки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...