我正在尝试从字符串中提取所有负数(双精度),我想要一个字符串作为回报。
示例: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
谢谢
答案 0 :(得分:0)
您可以使用此正则表达式提取在之前和之后有空格的数字(包括小数和减号):
(?<=\s)-?[\d.]+(?=\s)
(?<=\s)
是一个在数字前面寻找空格\s
的后视镜-?
表示可能存在或可能不存在减号[\d.]+
匹配任何数字和小数点(?=\s)
是一个积极的前瞻,在数字后面寻找空格\s
您可以使用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