Удалите начальные пробелы, используя переменную длину lookbehind в RegExp - PullRequest
1 голос
/ 07 мая 2010

Мне интересно, поддерживаются ли утверждения обратной длины с переменной длиной в движке JavaScript RegExp?

Например, я пытаюсь сопоставить строку " переменной длины " в строке " [ много пробелов и / или табуляций ] переменной длины.", и у меня есть что-то вроде этого, но это не подходит для различных тестеров RegExp:

^(?<=[ \t]+).+(?= lookbehind)

Если это недопустимый шаблон, какой будет хороший обходной путь? Спасибо!

Ответы [ 4 ]

2 голосов
/ 07 мая 2010

Я не знаю, поможет ли это вам с RegExp, но если вы хотите удалить пробелы, вы можете использовать функцию обрезки

function trimAll(sString) {
  while (sString.substring(0, 1) == ' ') {
    sString = sString.substring(1, sString.length);
  }
  while (sString.substring(sString.length - 1, sString.length) == ' ') {
    sString = sString.substring(0, sString.length - 1);
  }
  return sString;
}

В противном случае, если вы хотите проверить существование строки, вы можете использовать indexOf IndexOf на StackOverflow.com

2 голосов
/ 07 мая 2010

Движок регулярных выражений Javascript не поддерживает просмотр назад, поддерживаются только просмотр. Здесь вы можете найти имитирующее решение: http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript

2 голосов
/ 07 мая 2010

См. Ускоренная обрезка JavaScript

Он показывает многочисленные способы выполнения обрезки (ни один из которых не требует предварительного просмотра), а также сравнивает скорость различных подходов. Если конечная цель включает удаление начальных пробелов, не бойтесь разбить ее на несколько операций.

Некоторые люди, сталкиваясь с проблемой, думают: «Я знаю, я буду использовать регулярные выражения». Теперь у них две проблемы - Джейми Завински

2 голосов
/ 07 мая 2010

Javascript вообще не имеет оглядки назад. Стивену Левитану написано несколько слов, чтобы имитировать его , что может быть полезно.

Я не совсем понимаю ваш пример, потому что кажется, что это будет отвечать всем требованиям:

/^\s+(.+)lookbehind$/

... который соответствует одному или нескольким пробельным символам, за которыми следует один или несколько символов (в группе захвата), за которыми следует слово «lookbehind». Используется так:

var str = "        variable length lookbehind";
var match = /^\s+(.+)lookbehind$/.exec(str);

возвращает этот массив:

match[0]: |        variable length lookbehind|
match[1]: |variable length|

В Javascript первая запись в массиве - это полная совпавшая строка, а последующие записи - группы захвата.

Но вы, очевидно, хорошо разбираетесь в регулярных выражениях, поэтому я не уверен, что это то, что вы ищете ...

Что следует знать в этой общей области, так это то, что ряд реализаций движков RegExp в Javascript не вполне обрабатывает \s правильно (они пропускают сопоставление некоторых пробельных символов выше диапазона ASCII ); см. тест S_REGEXP_WHITESPACE_CHARACTER_CLASS_BUGGY здесь .

...