TypeScript получает информацию о RegEx [duplicate]

Эта проблема не всегда связана с политикой исполнения PowerShell. Моя машина настроена как «Неограниченная» для PowerShell x64 и x86, но я все еще получаю это сообщение об ошибке от времени до времени в Visual Studio 2013.

Когда я пытаюсь открыть консоль диспетчера пакетов:

Windows PowerShell успешно обновила вашу политику выполнения, но параметр переопределяется политикой, определенной в более конкретной области. Из-за переопределения ваша оболочка сохранит текущую эффективную политику выполнения Unrestricted. Введите «Get-ExecutionPolicy -List», чтобы просмотреть параметры политики выполнения.

Это неверное сообщение об ошибке.

Перезагрузка Visual Studio не всегда разрешает проблему.

Выполнение процесса как администратора никогда не устраняет проблему.

Как и в Declan, последнее обновление плагина диспетчера пакетов исправило проблему: 2.8.60723.765

92
задан stagas 19 February 2010 в 11:45
поделиться

7 ответов

Вот что я придумал:

// Finds starting and ending positions of quoted text
// in double or single quotes with escape char support like \" \'
var str = "this is a \"quoted\" string as you can 'read'";

var patt = /'((?:\\.|[^'])*)'|"((?:\\.|[^"])*)"/igm;

while (match = patt.exec(str)) {
  console.log(match.index + ' ' + patt.lastIndex);
}

47
ответ дан Ruslan López 20 August 2018 в 09:36
поделиться
  • 1
    Спасибо @Gumbo за вашу помощь – stagas 19 February 2010 в 12:39
  • 2
    match.index + match[0].length также работает для конечной позиции. – Beni Cherniavsky-Paskin 6 June 2013 в 07:58
  • 3
    очень приятно - сравнение здесь – Louis Maddox 18 March 2015 в 02:37
  • 4
    @ Бени Чернявский-Паскин, не будет ли конечная позиция match.index + match[0].length - 1? – David 19 May 2015 в 16:56
  • 5
    @David, я имел в виду исключительную конечную позицию, как принято, например. по .slice() и .substring(). Инклюзивный конец будет 1 меньше, как вы говорите. (Будьте осторожны, что включительно обычно означает индекс последнего совпадения символа внутри, если только это не пустое совпадение, где оно соответствует 1 до и может быть -1 вне строки целиком для пустого совпадения при запуске ...) – Beni Cherniavsky-Paskin 19 May 2015 в 18:06

Вот замечательная функция, которую я недавно обнаружил, я пробовал это на консоли и, похоже, работал:

var text = "border-bottom-left-radius";

var newText = text.replace(/-/g,function(match, index){
    return " " + index + " ";
});

Который вернулся: «border 6 bottom 13 left 18 radius»

Так что это похоже на то, что вы ищете.

4
ответ дан felipeab 20 August 2018 в 09:36
поделиться
  • 1
    просто следите за тем, чтобы функции замены добавляли группы захвата, так что обратите внимание, что это всегда вторая-последняя запись в функции замены arguments, которая является позицией. Не «второй аргумент». Аргументами функции являются «полное совпадение», «группа1», «группа2», «....», «совпадение», полная строка, сопоставленная с » – Mike 'Pomax' Kamermans 26 February 2017 в 01:00

Вы можете использовать метод search объекта String. Это будет работать только для первого матча, но в противном случае будет делать то, что вы описываете. Например:

"How are you?".search(/are/);
// 4
5
ответ дан Jimmy Cuadra 20 August 2018 в 09:36
поделиться

Этот член fn возвращает массив позиций 0, если они есть, входного слова внутри объекта String

String.prototype.matching_positions = function( _word, _case_sensitive, _whole_words, _multiline )
{
   /*besides '_word' param, others are flags (0|1)*/
   var _match_pattern = "g"+(_case_sensitive?"i":"")+(_multiline?"m":"") ;
   var _bound = _whole_words ? "\\b" : "" ;
   var _re = new RegExp( _bound+_word+_bound, _match_pattern );
   var _pos = [], _chunk, _index = 0 ;

   while( true )
   {
      _chunk = _re.exec( this ) ;
      if ( _chunk == null ) break ;
      _pos.push( _chunk['index'] ) ;
      _re.lastIndex = _chunk['index']+1 ;
   }

   return _pos ;
}

Теперь попробуйте

var _sentence = "What do doers want ? What do doers need ?" ;
var _word = "do" ;
console.log( _sentence.matching_positions( _word, 1, 0, 0 ) );
console.log( _sentence.matching_positions( _word, 1, 1, 0 ) );

Вы можете также вводят регулярные выражения:

var _second = "z^2+2z-1" ;
console.log( _second.matching_positions( "[0-9]\z+", 0, 0, 0 ) );

Здесь получается индекс положения линейного члена.

1
ответ дан Sandro Rosa 20 August 2018 в 09:36
поделиться

Из developer.mozilla.org docs в методе String .match():

Возвращенный массив имеет дополнительное свойство ввода, которое содержит исходную строку, которая был проанализирован. Кроме того, он имеет свойство index, которое представляет нулевой индекс совпадения в строке.

При работе с неглобальным регулярным выражением (т. Е. Флаг g в вашем регулярном выражении), значение, возвращаемое .match(), имеет свойство index ... все, что вам нужно сделать, это получить к нему доступ.

var index = str.match(/regex/).index;

Вот пример, показывающий его работу:

var str = 'my string here';

var index = str.match(/here/).index;

alert(index); // <- 10

Я успешно протестировал все это до IE5.

10
ответ дан TallTed 20 August 2018 в 09:36
поделиться

exec возвращает объект со свойством index:

var match = /bar/.exec("foobar");
if (match) {
    console.log("match found at " + match.index);
}

И для нескольких совпадений:

var re = /bar/g,
    str = "foobarfoobar";
while ((match = re.exec(str)) != null) {
    console.log("match found at " + match.index);
}

146
ответ дан undefined 20 August 2018 в 09:36
поделиться
  • 1
    Спасибо за вашу помощь! Можете ли вы также рассказать мне, как найти индексы нескольких совпадений? – stagas 19 February 2010 в 12:10
  • 2
    @stagas: В этом случае вам лучше использовать exec. – Gumbo 19 February 2010 в 12:13
  • 3
    match() не имеет никакого свойства index. Результатом является Array. – Onur Yıldırım 20 August 2014 в 03:28
  • 4
    Примечание: использование переменной re в качестве переменной и добавление модификатора g имеют решающее значение! В противном случае вы получите бесконечный цикл. – oriadam 24 December 2015 в 04:05
  • 5
    @ OnurYıldırım - Удалите флаг g, и он будет работать. Поскольку функция match является функцией строки, а не регулярным выражением, она не может быть такой же, как exec, поэтому она рассматривает ее как exec (т. Е. Имеет свойство индекса), если вы не ищете глобальное соответствие. .. потому что тогда состояние не имеет значения. – Jimbo Jonny 29 March 2016 в 22:41
var str = "The rain in SPAIN stays mainly in the plain";

function searchIndex(str, searchValue, isCaseSensitive) {
  var modifiers = isCaseSensitive ? 'gi' : 'g';
  var regExpValue = new RegExp(searchValue, modifiers);
  var matches = [];
  var startIndex = 0;
  var arr = str.match(regExpValue);

  [].forEach.call(arr, function(element) {
    startIndex = str.indexOf(element, startIndex);
    matches.push(startIndex++);
  });

  return matches;
}

console.log(searchIndex(str, 'ain', true));
1
ответ дан Yaroslav 20 August 2018 в 09:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: