正则表达式,匹配带连字符的浮点数

时间:2013-03-08 07:52:17

标签: javascript regex hyphen

另一个正则表达式问题:我正在研究javascript代码,我需要在连字符之间提取float或int数字。像这样:

var string="someText-180.5-200.70-someOtherText";

我需要得到:

var number1="180.5";
var number2="200.70";

有什么建议吗? (我对regex..grrr并不擅长)

谢谢!

5 个答案:

答案 0 :(得分:1)

当其他基于RegExp的解决方案有效时,我将提出一个不使用正则表达式的解决方案。 我的动机是有时候正则表达式很难阅读,修改和/或调试。

此代码返回一个数组,其中包含字符串中的所有浮点数(假设浮点数为正)

"someText-180.5-200.70-someOtherText".split("-"). //splits by hyphens
 map(function(elem){
    return parseFloat(elem);//convert each part to float
}).filter(function(elem){
   return elem===elem;//filter out the not-a-numbers,
                      // that is, stuff converting to float failed on
});

如果您对此更加满意,也可以在没有map/filter的情况下以较少的“功能”方式完成此操作。我相信代码可读性非常非常重要,您应该对自己的代码感到满意。你可以做到

var str = "someText-180.5-200.70-someOtherText";
var splitStr = str.split("-");
var arrayOfFloats = [];
for(var i=0;i<splitStr.length;i++){
   var asFloat = parseFloat(splitStr[i]);
   if(asFloat===asFloat){ //check for NaN, that is parse float fails
      arrayOfFloats.push(asFloat);   
   }
}
//now arrayOfFloats contains all the floats in your expression

如果您不想匹配第一个和最后一个部分(即只有 连字符之间的浮点数)元素,您可以slice首先使用它们:)

答案 1 :(得分:1)

其中一个问题是,正则表达式匹配:“-180.5-”,比下一个匹配将在“200.70-someOtherText”字符串中搜索,这样,当下一个搜索运行不匹配200.70时...... 我们应该做的不仅仅是写一个正则表达式。

在我的灵魂中,我提到了字符串的被检查部分,并在字符串的另一部分再次运行正则表达式..并且在匹配时执行。

见下面的代码:

    function findAllINeed(str){
         result = [];
         while ((match = /(?:\-)(([0-9]+)\.?([0-9]*))(?:\-)/.exec(str)) != null) {    
             str = str.substr(match.index + match[1].length)
             result.push(parseFloat(match[1]));
         }
         return result; 
    }

我试过了:

    findAllINeed("someText-180.5-200.70-someOtherText sd sdf -6 -6.777 7- s 4.55 -4-sdfsdfsdf -45.77-4-")
    [180.5, 200.7, 4, 45.77, 4]

不符合-6,-6.7777,4.55,7- ......

但是找到' - '字符之间的所有正浮点数或整数 我希望这能帮到你。

答案 2 :(得分:1)

您可以使用以下正则表达式来完成您要找的内容:

[0-9]*\.?,?[0-9]+

输入:

  • someText-180.5-200.70-someOtherText

输出:

  • 180.5
  • 200.70

答案 3 :(得分:0)

您可以使用此正则表达式:

var string="someText-180.5-200.70-someOtherText";

var match = string.match(/.*?(\d+(\.\d+)?).*?(\d+(\.\d+)?)/);
console.log(match[1]);  // prints 180.5
console.log(match[3]);  // prints 200.70

答案 4 :(得分:0)

var numbers = string.match(/[\d.]+/g)

或者,如果您担心多个句点会产生无效的数字:

var numbers = string.match(/\d+(\.\d+)?/g)