在小数点或字符串结尾处使用正则表达式分割数字。

时间:2011-07-30 04:33:14

标签: javascript regex

这是我想要发生的事情的一个例子

50.1-> [ '1' '50',]
50 - > ['50','']

我尝试过使用.split.match。我得到它用小数,但不是没有。

'51.11'.split(/(?=\.)/);//works
'51'.split(/(?=\.)|$/);//doesn't

我知道我可以通过几个步骤完成这项工作,但我认为可以使用正则表达式。我正在尝试学习正则表达式,但管道角色的行为并不像我期望的那样。此外,我不确定这是否可能。

4 个答案:

答案 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]