C#:更改正则表达式的 NumberDecimalSeparator
Posted
技术标签:
【中文标题】C#:更改正则表达式的 NumberDecimalSeparator【英文标题】:C#: Change NumberDecimalSeparator for Regex 【发布时间】:2018-09-27 02:38:22 【问题描述】:我正在使用正则表达式解析带有小数点分隔符的十进制值,它们是美国格式,例如:2.56
但是我系统的文化小数点分隔符设置为逗号,所以当我使用十进制类 \d 时,正则表达式无法将“2.56”识别为有效的十进制数。
为了可读性和简单性,我想坚持使用 \d。我可以强制它将点识别为小数分隔符吗?
使用 float.TryParse() 时,我可以强制它使用点作为小数分隔符:
var usCulture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US");
float.TryParse(text, System.Globalization.NumberStyles.Number, usCulture, out s )
我可以为正则表达式做类似的事情吗?
我尝试改变当前线程的文化:
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
但它似乎不会影响正则表达式,它仍然需要逗号作为小数分隔符。
【问题讨论】:
\d
匹配一个数字,而不是一个“数字”,并且不匹配任何小数分隔符。
当时我误读了文档。没有匹配十进制数的内置类,必须手动匹配?
@Yekoor,是的,您必须手动放置模式,例如 ^-?[0-9]+(\.[0-9]+)?$
见***.com/questions/9107673/…
见***.com/questions/273141/regex-for-numbers-only
【参考方案1】:
为了可读性和简单性,我想坚持使用
\d
。我可以强制它将点识别为小数分隔符吗?
不,这是因为 \d
是 [0-9]
的简写。它不匹配任何其他内容,包括分隔符。
如果你想匹配小数,你需要这样的东西:
-?\d+(\.\d+)?
Demo
【讨论】:
【参考方案2】:嗯,\d
是任何 unicode digit,而不是 浮点数。如果你坚持正则表达式,你必须手动构造模式;在最简单的情况下(没有指数部分,没有千位分隔符,任意长度等)它可以是
string escapedSeparator = Regex.Escape(
CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator);
string pattern = $"^-?[0-9]+(escapedSeparator[0-9]+)?$";
if (Regex.IsMatch("-123.456", pattern))
...
我真的怀疑它是否比double.TryParse(...)
更好为此目的而专门设计。
【讨论】:
以上是关于C#:更改正则表达式的 NumberDecimalSeparator的主要内容,如果未能解决你的问题,请参考以下文章