这是我想要发生的事情的一个例子
50.1-> [ '1' '50',]
50 - > ['50','']
我尝试过使用.split
或.match
。我得到它用小数,但不是没有。
'51.11'.split(/(?=\.)/);//works
'51'.split(/(?=\.)|$/);//doesn't
我知道我可以通过几个步骤完成这项工作,但我认为可以使用正则表达式。我正在尝试学习正则表达式,但管道角色的行为并不像我期望的那样。此外,我不确定这是否可能。
答案 0 :(得分:4)
您可以match
使用/(\d+)(\.\d+)?/
:
m = "50".match(/(\d+)(\.\d+)?/)
# ["50", "50", undefined]
m = "50.4".match(/(\d+)(\.\d+)?/)
# ["50.4", "50", ".4"]
使用捕获组填充m[1]
和m[2]
值。
如果你真的需要一个空格,你可以试试像/(\d+)((?:\.?)\d*)?/
:
m = "50.0".match(/(\d+)((?:\.?)\d*)?/)
# ["50.0", "50", ".0"]
m = "50.".match(/(\d+)((?:\.?)\d*)?/)
# ["50.", "50", "."]
m = "50".match(/(\d+)((?:\.?)\d*)?/)
# ["50", "50", ""]
但是,您必须检查"."
而不是检查undefined
。你可以开始添加更多的组和替换来处理单个"."
问题,但我不知道它会如何更好:
first = m[1];
second = m[2] || '';
答案 1 :(得分:2)
将.match
与/(\d+)((?:\.\d+)?)/
一起使用。
/(\d+)(\.\d+|)/
也可以。第二组将匹配一个点和一个或多个数字,或一个空字符串。
答案 2 :(得分:0)
|是替代运营商。 /\.|$/
匹配'。'或$,表示字符串的结尾。将$放入正则表达式的原因不会导致数组中的空字符串,因为split永远不会将您拆分字符串的内容放入数组中。您会注意到小数点也是“缺失”。
答案 3 :(得分:0)
我笑的时候人们会用正则表达式来解决问题,因为有几行常规非正则表达式代码有时更易读,更容易控制确切的结果,并且可能更快一些数量级。 / p>
这是一种产生双元素数组的非正则形式方法,其中数组的第一个元素具有数字的左侧部分,而数组的第二个元素具有数字的小数部分,并且始终以句点开头
jsFiddle这里:http://jsfiddle.net/jfriend00/vTPrv/。
代码:
var testStrings = [
"50",
"50.",
"50.4",
"0.4",
".4",
"0",
"50.4444"
];
function getDecimalPieces(str) {
if (str[0] == ".") {
str = "0" + str; // make sure we always have first part
}
var pieces = str.split(".");
if (pieces.length == 1) {
pieces.push("0"); // add decimal part
}
if (pieces[1] == "") {
pieces[1] = "0";
}
if (pieces.length > 2) {
pieces.slice(2); // remove any extra pieces
}
pieces[1] = "." + pieces[1]; // add period back onto decimal piece
return(pieces);
}
for (var i = 0; i < testStrings.length; i++) {
var result = getDecimalPieces(testStrings[i]);
$("#result").append("[" + result[0] + ", " + result[1] + "]<br />");
}
结果:
[50, .0]
[50, .0]
[50, .4]
[0, .4]
[0, .4]
[0, .0]
[50, .4444]