【问题标题】:String validation based on a custom format基于自定义格式的字符串验证
【发布时间】:2020-07-30 14:04:52
【问题描述】:

我想根据自定义格式验证字符串:(_.__,_.__)。这应该是一个十进制输入,后跟一个逗号,然后是另一个十进制输入,用括号括起来——例如(1.01,3.21)。我希望字符串模式接受一个或多个条目,例如(1.01,3.21)(3.01,4.51)...(2.1,5.6)。有可能吗?

【问题讨论】:

  • 请展示你到目前为止所做的事情,分享你的代码。 Regex.IsMatch 可以帮助。用正确的模式
  • bool isValid = Regex.Replace(input, @"\(\d+\.\d+,\d+\.\d+\)", "").Length == 0;

标签: c# regex string validation format


【解决方案1】:

解决这个问题的一种方法是:

  • 使用 RegEx 返回 (x,y) 模式的匹配项。
  • 使用扩展方法提取xy
  • 使用decimal.TryParse(..)方法检查xy是否为decimal类型。
  • 检查输入字符串是否包含所需模式以外的其他内容。
private bool IsValidInput(string input)
{
    var pattern = @"\((.*?)\s?,\s?(.*?)\)";
    var xpatt = @"\s+\(|\s+\)|\,\(|\)\,|\)\s+|\({2,}|\){2,}|^\)\(|\)\($";
    var q = Regex.Matches(input, pattern)
        .Cast<Match>()
        .SelectMany(x => x.Groups.Cast<Group>()
        .Skip(1))
        .Select(x => x.Value);

    return !Regex.IsMatch(input, xpatt)
        && q.Count() > 0 
        && input.Replace(" ","").Length 
        == (input.Count(x => x == '(' || x == ')' || x == ',') 
        + q.Sum(x => x.Length))
        && q.All(x => decimal.TryParse(x, out _));
}

所以,函数返回:

(1.01, 3.21)(3.01, 4.51)(2.1, 5.6)     => true
(abc, 3.21)(3.01, 4.51)(2.1, 5.6)      => false
(3.21)(3.01, 4.51)(2.1, 5.6)           => false
1.01, 3.2 13.01, 4.51 2.1, 5.6         => false
1.01, 3.21)(3.01, 4.51)(2.1, 5.6)      => false
(1.01, 3.21)(3.01, 4.51)(2.1, 5.6      => false
1.01, 3.21)3.01, 4.51)2.1, 5.6)        => false
(1.01, 3.21)3.01, 4.51(2.1, 5.6)       => false
(1.01, 3.21)abc(3.01, 4.51)(2.1, 5.6)  => false
(1.01, 3.21)(3.01, 4.51)abc(2.1, 5.6)  => false
abc(1.01, 3.21)(3.01, 4.51)(2.1, 5.6)  => false
(1.01, 3.21)(3.01, 4.51)(2.1, 5.6)abc  => false

【讨论】:

    【解决方案2】:

    我认为这应该可以解决您的问题: ^(?:\(\d+(?:\.\d+)?,\d+(?:\.\d+)?\))+$ try it out 目前我将所有捕获组设为非捕获组,因为我不确定您想要捕获的任何特定子组。

    【讨论】:

      【解决方案3】:

      你可以使用

      (?:\(\d+(?:\.\d+)?,\d+(?:\.\d+)?\))+
      

      或带有全局标志

      \(\d+(?:\.\d+)?,\d+(?:\.\d+)?\)
      

      First solution 将匹配您的模式 1 次或多次并返回一个匹配项。 The second 只会匹配您的模式一次。但是,使用全局标志,您将获得所有匹配项作为单独的结果。

      解释:

      (?:                   //begin non-capturing group
        \(                  //match opening parentheses
          \d+               //match 1 or more numbers
          (?:\.\d+)?        //optionally match a dot followed by 1 or more numbers
          ,                 //match a comma
          \d+(?:\.\d+)?     //same pattern as before comma
        \)                  //match closing parentheses
      )+                    //close non-capturing group, match the group 1 or more times
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-03
        • 2012-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        相关资源
        最近更新 更多