0

另一个正则表达式问题:我正在编写 javascript 代码,我需要在连字符之间提取浮点数或整数。像这样:

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

我需要得到:

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

有什么建议吗?(我一点都不擅长正则表达式..grrr)

谢谢!

4

5 回答 5

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- ...

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

于 2013-03-08T08:15:40.227 回答
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先匹配它们 :)

于 2013-03-08T07:58:51.973 回答
1

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

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

输入:

  • someText-180.5-200.70-someOtherText

输出:

  • 180.5
  • 200.70
于 2013-06-22T03:05:26.423 回答
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
于 2013-03-08T07:55:57.543 回答
0
var numbers = string.match(/[\d.]+/g)

或者,如果您担心多个时期会产生无效数字:

var numbers = string.match(/\d+(\.\d+)?/g)
于 2013-03-08T08:01:40.473 回答