javascript.split не возвращает ожидаемые значения - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть значение javascript, содержащее строку:

value = "123 / 15 - Value1"

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

Я пробовал это:

value = "123 / 15 - Value1"
splitVal = value.split(/[" ".,\/ -]/);
number1 = splitVal[0];
number2 = splitVal[1];
name = splitVal[2];

Но когда я консоль log1, number2 и name, я получаю только 123 в консоли, остальные 2 остаются пустыми.

Что я здесь делаю неправильно, если разбить строку на дефис и косую черту, а также на пробелы?

Ответы [ 9 ]

0 голосов
/ 14 сентября 2018

Проблема в том, что вы разделяете на (пробел) и /, поэтому 123 / 15 становится:

[
  '123',
  // space
  '',
  // /
  '',
  // space
  '15'
]

Если вы знаете, как должен выглядеть шаблон, вы можете использовать match вместо разбиения:

value = "123 / 15 - Value1"
matchVal = value.match(/^(\d+)\s*\/\s*(\d+)\s*-\s*(.*)$/);
console.dir(matchVal)

С соответствием вы можете точно определить, как должен быть отформатирован ввод и какие поля ввода вы хотите извлечь.

Кроме того, он позволяет name быть чем-то вроде Value-1 with spaces, если это требуется, (если это не разрешено, вы можете изменить (.*) на более ограничительное совпадение):

value = "123 / 15 - Value-1 with spaces"
matchVal = value.match(/^(\d+)\s*\/\s*(\d+)\s*-\s*(.*)$/);
console.dir(matchVal)

Использование regex101.com поможет вам понять, что делает earch часть регулярного выражения.

0 голосов
/ 14 сентября 2018

Регулярное выражение в вашем коде приводит к ["123", "", "", "15", "", "", "Value1"]. В индексе 1 & 2 вы можете видеть, что они являются пустым пространством.Вы можете немного изменить регулярное выражение

var value = "123 / 15 - Value1";

var splitVal = value.split(/[\/-]/),
  number1 = splitVal[0].trim(),
  number2 = splitVal[1],
  name = splitVal[2];

console.log(number1, number2, name)
0 голосов
/ 14 сентября 2018
var value = "123 / 15 - Value1";
var r = value.split(/\s?[\/-]\s?/);
console.log(r);
/*
[ '123', '15', 'Value1' ]
*/
0 голосов
/ 14 сентября 2018

Вы можете использовать match() вместо split():

var value = "123 / 15 - Value1"

var splitVal= value.match(/[a-z0-9]+/gi);

console.log(splitVal)
0 голосов
/ 14 сентября 2018

Это будет работать:

splitVal= value.split(/[" ".,\/ -]+/);

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

0 голосов
/ 14 сентября 2018

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

let str = '123 / 15 - Value1';
let reg = /\w+/g;

let res;
let results = [];
while ((res = reg.exec(str)) !== null) {
    results.push(res);
}

if (results.length > 0) {
    console.log('Results = ' + results);
} else {
    console.log('No results.')
}
0 голосов
/ 14 сентября 2018

Вы можете использовать String.prototype.match() и присвоение деструктурирования со следующим RegExp:

const value = '123 / 15 - Value1'
const [, number1, number2, name] = value.match(/(\d+) *\/ *(\d+) *- *(.+)/)

console.log(number1, number2, name)
0 голосов
/ 14 сентября 2018

Вы должны удалить пробелы перед разбиением, как это:

splitVal= value.replace(/ /g,'').split(/[" ".,\/ -]/);
0 голосов
/ 14 сентября 2018

С

console.table("123 / 15 - Value1".split(/[" ".,\/ -]/))

вы узнаете, что происходит на самом деле: все значения, кроме индексов 0,3,6, являются пустыми строками

...