Я - мусор в Регулярных выражениях, действительно!
То, что я хотел бы, должно разделить строку, содержащую значение свойства 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
!
Спасибо до сих пор парни!
Использование групп захвата:
var matches = "100%".match(/^(\d+(?:\.\d+)?)(.*)$/);
Вам повезло. match
возвращает массив с полным совпадением в первой позиции, за которым следует каждая группа.
split
, вероятно, здесь неверен, так как вы хотите сохранить полное совпадение. Если вы хотите получить, например, ['100', '%']
, вы могли бы сделать .split (/ \ b /)
.
Обновлено, чтобы включить дроби. Кроме того, использование обоих якорей не будет соответствовать формату, отличному от [число] [единица измерения]
, поэтому возвращается null
.
"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
Попробуйте:
cssProperty.match(/^([0-9]+\.?[0-9]*)(.*)/);
Более сложный, но вернет проанализированное число и ноль для некоторых строк мусора
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
function mySplit(str)
{
var regex = /(\d*)([^\d]*)/;
var t = "$1$2,$1,$2";
return str.replace(regex,t).split(",");
}