От сети разработчиков 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", ""]
Это не соответствует целому слову, чтобы начать с. И, честно говоря, я даже не знаю, что здесь происходит.
Как правильно разбить строку, используя регулярные выражения, без разделителя в моем результате?
Возможно 'string5.split (/ \ s (раскол |? Восклицательный знак |? SPLOT) \ s /)' – SeinopSys
Как вы поняли, что вам не нужно (и не хотите) группы. Чтобы включить пробелы в качестве разделителей, вы можете вводить их в каждом чередовании - '/ split | splat | splot/' – ClasG