.split (“1 пкс”) в [“1 пкс”, 1, “пкс”] в JavaScript

Я - мусор в Регулярных выражениях, действительно!

То, что я хотел бы, должно разделить строку, содержащую значение свойства CSS в массив [string,value,unit].

Например: если я предоставил .split() метод с 1px это возвратилось бы ["1px",1,"px"]. Если я должен был предоставить, точно так же 10% это возвратилось бы ["10%",10,"%"].

Это может быть сделано?

Я ценю всю Вашу справку!

Обновление: я также хотел бы, чтобы это возвратилось ["1.5em",1.5,"em"] если 1.5em были предоставлены. Но, если это возможно, все еще возвратите пустой указатель, если предоставлено yellow. К сожалению, /^([0-9]*\.?[0-9]*)(.*)/ предоставленный yellow возвратился бы y,,y!

Спасибо до сих пор парни!

6
задан Alan Moore 19 May 2010 в 22:01
поделиться

5 ответов

Использование групп захвата:

var matches = "100%".match(/^(\d+(?:\.\d+)?)(.*)$/);

Вам повезло. match возвращает массив с полным совпадением в первой позиции, за которым следует каждая группа.
split , вероятно, здесь неверен, так как вы хотите сохранить полное совпадение. Если вы хотите получить, например, ['100', '%'] , вы могли бы сделать .split (/ \ b /) .

Обновлено, чтобы включить дроби. Кроме того, использование обоих якорей не будет соответствовать формату, отличному от [число] [единица измерения] , поэтому возвращается null .

8
ответ дан 8 December 2019 в 05:53
поделиться
"1px".match(/(\d*\.?\d*)(.*)/)

yields

["1px", "1", "px"]

Я обновил выражение, чтобы оно соответствовало действительным числам с начальными и конечными десятичными знаками.

var expr  = /(\d*\.?\d*)(.*)/,
    cases = [
    "1px",
    "1.px",
    "11.px",
    "11.1px",
    "11.11px",
    "1.11px",
    ".11px",
    ".1px",
    ".px" // Invalid numeric value, but still preserves unit and can be handled as seen below
];

for ( var i=0,l=cases.length; i<l; ++i ) {
    var r = cases[i].match(expr );
    console.log(r, parseFloat(r[1], 10) || 0);
}

Результаты

["1px", "1", "px"] 1
["1.px", "1.", "px"] 1
["11.px", "11.", "px"] 11
["11.1px", "11.1", "px"] 11.1
["11.11px", "11.11", "px"] 11.11
["1.11px", "1.11", "px"] 1.11
[".11px", ".11", "px"] 0.11
[".1px", ".1", "px"] 0.1
[".px", ".", "px"] 0
8
ответ дан 8 December 2019 в 05:53
поделиться

Попробуйте:

cssProperty.match(/^([0-9]+\.?[0-9]*)(.*)/);
5
ответ дан 8 December 2019 в 05:53
поделиться

Более сложный, но вернет проанализированное число и ноль для некоторых строк мусора

String.prototype.unitSplit = function(parse){
    var retArr = this.toString().match(/^([\d]*\.?[\d]+)([^\d]*)$/);
    if(retArr && parse != undefined)
    {
        retArr[1] = (retArr[1].indexOf('.') >= 0)?parseFloat(retArr[1]):parseInt(retArr[1]);
    }
    return retArr;
}
/* Test cases */
"10px".unitSplit(); //["10px", "10", "px"]
"20%".unitSplit(true); //["20%", 20, "%"]
".8em".unitSplit(true); //[".8em", 0.8, "em"]
"127.0.0.1localhost".unitSplit(true); //null
1
ответ дан 8 December 2019 в 05:53
поделиться
function mySplit(str)
{
    var regex = /(\d*)([^\d]*)/;
    var t = "$1$2,$1,$2";
    return str.replace(regex,t).split(",");
} 
0
ответ дан 8 December 2019 в 05:53
поделиться
Другие вопросы по тегам:

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