C# 正则表达式过滤非数字字符

C# 正则表达式过滤非数字字符,c#,regex,number-formatting,C#,Regex,Number Formatting,我有一个Regex在解析十进制数之前删除非数字字符 我使用以下代码 Regex.Replace(myStr, "[^0-9.]", ""); 现在这适用于十进制数字,但它删除了“符号”字符,即“A16.1”和“A-16.1”的输出同时返回“16.1” 使用以下编辑版本似乎有效 Regex.Replace(myStr, "[^-0-9.]", ""); 但是由于不熟悉正则表达式,有经验的用户能否确认这是正确的表达式…?我建议 -?[0-9]+(\.[0-9]+)? 模式,即删除小数将是

我有一个
Regex
在解析十进制数之前删除非数字字符

我使用以下代码

Regex.Replace(myStr, "[^0-9.]", "");
现在这适用于十进制数字,但它删除了“符号”字符,即“A16.1”和“A-16.1”的输出同时返回“16.1”

使用以下编辑版本似乎有效

Regex.Replace(myStr, "[^-0-9.]", "");
但是由于不熟悉正则表达式,有经验的用户能否确认这是正确的表达式…?

我建议

 -?[0-9]+(\.[0-9]+)?
模式,即删除小数将是

 string result = Regex.Replace(myStr, @"-?[0-9]+(\.[0-9]+)?", "");
说明:

 -?           one or zero minus sign "-" - sign
 [0-9]+       at least one digit
 (\.[0-9]+)?  followed by one or none 
              fractional part (decimal separator and at least one digit)
如果您想获取(而不是删除)号码,请使用
匹配项

 string myStr = "-1,2.3.de2.43.";

 string[] numbers = Regex
   .Matches(myStr, @"-?[0-9]+(\.[0-9]+)?")
   .OfType<Match>()
   .Select(match => match.Value)
   .ToArray(); 

 // Test
 Console.Write(string.Join(Environment.NewLine, numbers));

在表达式
[^-0-9.]
中,连字符在方括号内具有特殊含义。。。除非它出现在方括号的开头或结尾。这里的
-
字符表示它接受一个范围:在本例中,是介于
0
9
之间的任何字符,如
0-9

但是,当连字符是第一个或最后一个时,它没有“从”(或“到”)可转,因此它不能被视为“范围”,因此被解析为
-
字符

我发现,略显冗长并转义连字符可以让用户将连字符放在方形字符组块中的任何位置,而不用担心它会意外地被解析为“范围”指示符:
[^-0-9.]
[^0-9.-.]
[^0-9.\-]


由于在开头或结尾放置了连字符,您不需要显式转义字符,因此上面的内容可以正常工作,但如果使用转义版本,您(或其他用户)可能会更容易阅读(并在将来扩展)要知道连字符应按字面意思用作连字符。

[^-0-9.]
匹配的字符不是
-
、数字或
。这就是你需要知道的全部,或者还有什么其他的吗?好的,所以我用空字符串替换除了那些字符之外的所有字符-所以这正是我需要的,谢谢!那么,这是一个重复的感谢+1的解释。作为旁注:强制使用小数部分会使它无法处理没有小数部分的情况-因此我将实际使用
@[^-0-9.]”
@neggenbe:请注意
(\.[0-9]+)?
中的
表示零或一个小数部分;所以没有小数部分的情况被覆盖,你能把它扩展到处理0.1和1吗。as 1.0(至少Python解释器将其作为十进制数处理)。@CodeMonkey:case
.1
1.
都是有效的浮点,
@-?([0-9]+(\.[0-9]*))|([0-9]*\.[0-9]+)“
模式就可以了
 -1
 2.3
 2.43