2016-06-15 4 views
5

От сети разработчиков Mozilla для функции split():JavaScript разбить строку с .match (регулярное выражение)

Раскол() метод возвращает новый массив.

При обнаружении разделитель удаляется из строки, а подстроки возвращаются в массиве. Если разделитель не найден или опускается, массив содержит один элемент, состоящий из всей строки. Если разделитель является пустой строкой, str преобразуется в массив из символов.

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

Рассмотрим следующий пример:

var string1 = 'one, two, three, four'; 
var splitString1 = string1.split(', '); 
console.log(splitString1); // Outputs ["one", "two", "three", "four"] 

Это действительно чистый подход. Я попробовал то же самое с регулярным выражением и несколько иной последовательности:

var string2 = 'one split two split three split four'; 
var splitString2 = string2.split(/\ split\ /); 
console.log(splitString2); // Outputs ["one", "two", "three", "four"] 

Это работает точно так же, как и в первом примере. В следующем примере я изменил строку еще раз, с 3-х различными разделителями:

var string3 = 'one split two splat three splot four'; 
var splitString3 = string3.split(/\ split\ |\ splat\ |\ splot\ /); 
console.log(splitString3); // Outputs ["one", "two", "three", "four"] 

Однако регулярное выражение прямо сейчас получает относительно грязным. Я могу сгруппировать различные разделители, однако результат будет включать в себя эти разделители:

var string4 = 'one split two splat three splot four'; 
var splitString4 = string4.split(/\ (split|splat|splot)\ /); 
console.log(splitString4); // Outputs ["one", "split", "two", "splat", "three", "splot", "four"] 

Так что я попытался удалить пробелы из регулярного выражения, оставляя группу, без особого толку:

var string5 = 'one split two splat three splot four'; 
var splitString5 = string5.split(/(split|splat|splot)/); 
console.log(splitString5); 

Хотя , когда я удалить скобки в регулярном выражении, разделитель исчез в разделенной строке:

var string6 = 'one split two splat three splot four'; 
var splitString6 = string6.split(/split|splat|splot/); 
console.log(splitString6); // Outputs ["one ", " two ", " three ", " four"] 

в качестве альтернативы можно использовать match() отфильтровывать разделители, за исключением того, я не очень понимаю, как обратная lookaheads работы:

var string7 = 'one split two split three split four'; 
var splitString7 = string7.match(/((?!split).)*/g); 
console.log(splitString7); // Outputs ["one ", "", "plit two ", "", "plit three ", "", "plit four", ""] 

Это не соответствует целому слову, чтобы начать с. И, честно говоря, я даже не знаю, что здесь происходит.


Как правильно разбить строку, используя регулярные выражения, без разделителя в моем результате?

+0

Возможно 'string5.split (/ \ s (раскол |? Восклицательный знак |? SPLOT) \ s /)' – SeinopSys

+0

Как вы поняли, что вам не нужно (и не хотите) группы. Чтобы включить пробелы в качестве разделителей, вы можете вводить их в каждом чередовании - '/ split | splat | splot/' – ClasG

ответ

7

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

var string4 = 'one split two splat three splot four'; 
 
var splitString4 = string4.split(/\s+(?:split|splat|splot)\s+/); 
 
console.log(splitString4);

// Output => ["one", "two", "three", "four"] 
1

Если вы хотите использовать match вы можете написать его как

'one split two split three split four'.match(/(\b(?!split\b)[^ $]+\b)/g) 
["one", "two", "three", "four"] 

Что он делает?

  • \b Соответствует границе слова

  • (?!split\b) Отрицательный взгляд вперед, проверьте, если слово неsplit

  • [^ $]+ Матчи ничего, кроме пространства или $, конец строки. Этот шаблон будет соответствовать слову, внешний вид гарантирует, что он соответствует не split.

  • \b Соответствует концу слова.