2016-03-24 2 views
1

Я хочу извлечь каждый блок буквенно-цифровых символов, которые появляются после подчеркивания в строке Javascript. Я в настоящее время он работает с использованием комбинации методов строковых и регулярное выражение, как так:Получение каждого слова после каждого подчеркивания в строке в Javascript с использованием regex

var string = "ignore_firstMatch_match2_thirdMatch";  
var firstValGone = string.substr(string.indexOf('_')); 
// returns "_firstMatch_match2_thirdMatch" 
var noUnderscore = firstValGone.match(/[^_]+/g); 
// returns ["firstMatch", "match2" , "thirdMatch"] 

мне интересно, если есть способ сделать это чисто с помощью регулярных выражений? Лучше всего мне удалось:

var string = "ignore_firstMatch_match2_thirdMatch"; 
var matchTry = string.match(/_[^_]+/g); 
// returns ["_firstMatch", "_match2", "_thirdMatch"] 

, но это также возвращает предыдущее подчеркивание. Учитывая, что вы не можете использовать lookbehinds в JS, я не знаю, как совместить символы после, но исключать сам подчеркивание. Это возможно?

+2

Просто используйте группу захвата '_ ([^ _] +)' и используйте 'RegExp # exec' в цикле. –

+0

http://stackoverflow.com/a/432503/4028085 – brso05

+0

Приветствия за все ответы. Я не пробовал перебирать группы, потому что думал, что может быть «более чистый» способ сделать это, поэтому спасибо, что сообщили мне, что петли и группы - это путь. – chrBrd

ответ

2

Вы можете использовать захват группы (_([^_]+)) и использовать RegExp#exec в цикле, выдвигая захваченные значения в массив:

var re = /_([^_]+)/g; 
 
var str = 'ignore_firstMatch_match2_thirdMatch'; 
 
var res = []; 
 
    
 
while ((m = re.exec(str)) !== null) { 
 
    res.push(m[1]); 
 
} 
 
document.body.innerHTML = "<pre>" + JSON.stringify(res, 0, 4) + "</pre>";

Заметим, что используя string#match() с регулярным выражением, определенным с помощью глобального модификатора /g потеряет все захваченные тексты, поэтому вы не можете просто использовать str.match(/_([^_]+)/g).

+0

См. Здесь [** regex demo ** здесь] (https://regex101.com/r/oZ6hF8/1). –

2

С lookbehind не поддерживается в JS, единственный способ, которым я могу думать, - использовать такую ​​группу.

Regex:_([^_]+) и группа захвата с использованием \1 или $1.

Regex101 Demo

var myString = "ignore_firstMatch_match2_thirdMatch"; 
 
var myRegexp = /_([^_]+)/g; 
 

 
match = myRegexp.exec(myString); 
 
while (match != null) { 
 
    document.getElementById("match").innerHTML += "<br>" + match[0]; 
 
    match = myRegexp.exec(myString); 
 
}
<div id="match"> 
 

 
</div>


Альтернативный способ использования lookahead будет что-то вроде этого.

Но это занимает много времени в JS. Убита моя страница трижды. Будет ли сделать хороший Redos использовать

Regex:(?=_([A-Za-z0-9]+)) и захвата групп с использованием \1 или $1.

Regex101 Demo

1

Почему вы предполагаете, что вам нужно регулярное выражение? простой раскол выполнит эту работу:

string str = "ignore_firstMatch_match2_thirdMatch"; 
IEnumerable<string> matches = str.Split('_').Skip(1); 
+0

Я не предполагаю, что мне это нужно, я знаю, что нет.Я пытаюсь улучшить использование регулярного выражения. – chrBrd