【问题标题】:Regex not matching the string format in C#正则表达式与 C# 中的字符串格式不匹配
【发布时间】:2019-10-12 18:36:09
【问题描述】:

我正在通过串口接收数据,我想验证数据格式是否正确。我期待的数据格式是这样的

数字,数字,数字,数字 -> 1200,2500,6500,90

我正在使用这样的正则表达式

Regex.IsMatch(s, @"^[0-4095]\,[0-4095]\,[0-4095]\,[0-4095]$")

使用 4095,因为数字范围在 0 到 4095 之间。需要帮助。提前致谢。

【问题讨论】:

标签: c# .net regex


【解决方案1】:

您可以使用简单的 LINQ 表达式和 int.TryParse 方法,无需依赖正则表达式:

  var sections = e.Split(',');
  sections.Count() == 4 && 
  sections.All(s => int.TryParse(s, out int i) && i >= 0 && i <= 4095);

【讨论】:

  • 在通过两步过程使用正则表达式验证格式,然后解析整数以检查它们的值之后,我得出结论这是最好的答案。正则表达式有其局限性。这是我认为正则表达式不是正确答案的情况。
  • 同意,正则表达式变得很难快速阅读,这克服了简洁性。
【解决方案2】:

也许,

^(?:40\d[0-5]|[1-3]\d{3}|\d{1,3}),(?:40\d[0-5]|[1-3]\d{3}|\d{1,3}),(?:40\d[0-5]|[1-3]\d{3}|\d{1,3}),(?:40\d[0-5]|[1-3]\d{3}|\d{1,3})$

Demo 1

如果000,000,000,000 有效,可能会正常工作,否则,

^(?:(?:40\d[0-5]|[1-3]\d{3}|[1-9]\d{2}|[1-9]\d|\d),){3}(?:40\d[0-5]|[1-3]\d{3}|[1-9]\d{2}|[1-9]\d|\d)$

也可能是一种选择。

Demo 2

测试

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"^(?:(?:40\d[0-5]|[1-3]\d{3}|[1-9]\d{2}|[1-9]\d|\d),){3}(?:40\d[0-5]|[1-3]\d{3}|[1-9]\d{2}|[1-9]\d|\d)$";
        string input = @"1200,2500,6500,90
            1200,2500,6500,90
            1200,2500,4095,90
            0,0,0,0
            999,1,0,99
            000,000,000,000
            4095,4095,4095,4095

            ";
        RegexOptions options = RegexOptions.Multiline;

        foreach (Match m in Regex.Matches(input, pattern, options))
        {
            Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
        }
    }
}

如果您希望简化/修改/探索表达式,在regex101.com 的右上角面板中已对此进行了说明。如果您愿意,您还可以在 this link 中观看它如何与一些示例输入匹配。


正则表达式电路

jex.im 可视化正则表达式:

【讨论】:

  • 这真的很有帮助!
【解决方案3】:

我们不能在这样的数字上做范围。您可以将此正则表达式用于您的用例:

^(([0-9]|[0-9][0-9]|[0-9][0-9][0-9]|0[0-9][0-9][0-9]|1[0-9][0-9][0-9]|2[0-9][0-9][0-9]|3[0-9][0-9][0-9]|40[0-9][0-5]),){3}([0-9]|[0-9][0-9]|[0-9][0-9][0-9]|0[0-9][0-9][0-9]|1[0-9][0-9][0-9]|2[0-9][0-9][0-9]|3[0-9][0-9][0-9]|40[0-9][0-5])$

已编辑:

^(([0-9]{1,3}|0[0-9]{3}|1[0-9]{3}|2[0-9]{3}|3[0-9]{3}|40[0-9][0-5]),){3}([0-9]{1,3}|0[0-9]{3}|1[0-9]{3}|2[0-9]{3}|3[0-9]{3}|40[0-9][0-5])$

或者,

^(?:(?:\d{1,3}|[0-3]\d{3}|40\d[0-5]),){3}(?:\d{1,3}|[0-3]\d{3}|40\d[0-5])$

我想你现在明白这个想法了。要检查一个数字是否介于 0-4095 之间,

  • 数字可以是个位数0-9
  • 可以是两位数[0-9][0-9]
  • 可以是任意三位数[0-9][0-9][0-9]
  • 但是,对于一个 4 位数字,我们必须忽略所有数字 大于 4095,

    这就是为什么查询需要比平时更长的原因。

  • 1[0-9][0-9][0-9] 涵盖从 1 开始的所有 4 位数字。

...

  • 40[0-9][0-5] 涵盖了 4000 到 4095 之间的所有数字

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多