替换字符串中不必要的每个字母/数字

时间:2017-05-20 18:38:44

标签: c# regex string double

我正在尝试从字符串中提取所有负数(双精度),我想要一个字符串作为回报。

示例:CO2:404 ppm CO2

我写的方法:

public string extractNumber(string input)
    {

        var allowedChars = "01234567890.,-";
        return new string(input.Where(c => allowedChars.Contains(c)).ToArray());
    }

这给了我一个输出字符串:

24042

我的问题:

这是最好的方法吗?或者我可以用regex.Replace吗?

如果我使用这种方法。如何删除正面和背面的2? 编辑:

输入:(所有单独的行)

Humidity: 33 %  
Temperature: -25.7 deg C  
Visible light: 112 lx  
Infrared radiation: 1802.5 mW/m2  
UV index: 10.12  
CO2: 4004 ppm CO2  
Pressure: 102126 Pa  

需要的输出:

33  
-25.7  
112  
1802.5  
10.12  
4004  
102126 

谢谢

3 个答案:

答案 0 :(得分:0)

您可以使用此正则表达式提取之前和之后有空格的数字(包括小数和减号):

(?<=\s)-?[\d.]+(?=\s)
  • (?<=\s)是一个在数字前面寻找空格\s的后视镜
  • -?表示可能存在或可能不存在减号
  • [\d.]+匹配任何数字和小数点
  • (?=\s)是一个积极的前瞻,在数字后面寻找空格\s

Regex 101 Demo

您可以使用Regex.Match()直接提取您要查找的号码。

string input = "CO2: 4004 ppm CO2";
Regex re = new Regex(@"(?<=\s)-?[\d.]+(?=\s)");
var p = re.Match(input);
// Output: 4004

这是一个演示:Dotnet Fiddle

答案 1 :(得分:0)

使用正则表达式的解决方案:

Regex regexObj = new Regex(@"\b-?\d+(\.?\d+)?\b");
Match matches = regexObj.Match(subjectString);
while (matches.Success)
{
    // matched text: matches.Value
    // match start: matches.Index
    // match length: matches.Length
    matches = matches.NextMatch();
}

答案 2 :(得分:0)

这使用了语言如何解析数值(无装饰)的核心 由于您没有任何可用的边界,您可以使用后备
空白边界。

(?<!\S)-?(?:\d+(?:\.\d*)?|\.\d+)(?!\S)

解释

 (?<! \S )                     # Whitespace boundary
 -?                            # Optional '-' sign
 (?:
      \d+                           # digit required
      (?: \. \d* )?                 # optional '.' and 0 to many digits
   |                              # or,
      \. \d+                        # required '.' and required digits
 )
 (?! \S )                      # Whitespace boundary