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的主要内容,如果未能解决你的问题,请参考以下文章

JS --正则表达式验证实战之邮箱模式

c# 正则表达式笔记

C#中正则表达式的使用

C#中正则表达式的使用

如何将 C# 正则表达式转换为打字稿正则表达式?

正则表达式 - 将 C# 正则表达式转换为 JavaScript 正则表达式的量词的目标无效