RegEx查找字符串中的数字序列,以空格分隔预定义的最大长度

时间:2017-08-02 09:01:08

标签: c# .net regex

很抱歉这个令人困惑的标题,我会试着用例子来解释一下。目前我们有这个表达式来查找字符串中的数字序列
\b((\d[ ]{0,1}){13,19})\b
现在我想修改它以符合这些规则   - 长度应在13到19个字符之间,不包括空格
  - 每个数字群集必须至少有3位数

表达式应将这些标记为匹配:

  

1234567890123
  1234 5678 9012 345

不匹配:

  

123456789012 3
  123 12 123 1 23134

我所拥有的当前表达将所有这些表示为匹配 Example

3 个答案:

答案 0 :(得分:3)

这可以通过环视来实现。

正则表达式可以更改为以下内容:

\b(?<!\d )(?=(?:\d ?){13,19}(?! ?\d))(?:\d{3,} ?)+\b(?! ?\d)

这可以通过展望来确保数字长度在13到19位之间。然后匹配3位或更多位的组。然后在发现所有3组之后使用负向前看以确保没有任何数字。如果有,我们发现一个小于3的组。这适用于您提供的示例。

  • \b确保它是&#34;字的开头&#34;。
  • (?<!\d )确保没有数字。
  • (?=(?:\d ?){13,19}(?! ?\d))向前看以确保数字长度在13到19位之间
    • (?:\d ?){13,19}来自原创。添加了?:以进行非捕获
    • (?! ?\d)负向前看:如果在获得19位数字后仍有数字,则过大会丢弃当前匹配
  • (?:\d{3,} ?)+匹配任意数量的大于3的群集(最小值13,最大值为19,首先向前看)
  • \b(?! ?\d)查找群集的结尾。如果在群集结束后仍有数字,则必须存在太小的群集。

Test here

答案 1 :(得分:1)

我建议以下解决方案也基于外观:

\b\d(?!\d?\b)(?: ?\d(?!(?<= \d)\d?\b)){12,18}\b

请参阅ORB and BRISK

重点是,如果它不是1位或2位数组的一部分,我们只匹配下一位数。

模式说明

  • \b - 开始字边界
  • \d(?!\d?\b) - 一个未跟随1或0位的数字,然后是一个尾随字边界(即,如果它是121类似于组,则会失败)
  • (?: ?\d(?!(?<= \d)\d?\b)){12,18} - 12到18次出现:
    • ? - 1或0个空格
    • \d(?!(?<= \d)\d?\b) - 任何未跟随1或0位的单个数字后跟一个字边界(感谢(?!\d?\b)),如果该1或0位前面有空格+ 1数字((?<= \d) lookbehind确实如此)
  • \b - 一个尾随字边界。

请注意,如果您想在非数字上下文中匹配这些字符串(也就是说,如果您不想允许左侧和右侧的任何数字),您可能还会考虑添加(?<!\d *)位于前面,(?! *\d)位于模式的末尾。

请注意,要匹配任何空格,您可以在模式中用\s替换文字空间。

答案 2 :(得分:0)

如果您可以使用Linq,这将更容易维护:

var myList = new List<string>
                    {
                    "1234567890123",
                    "1234 5678 9012 345",
                    "123456789012 3",
                    "123 12 123 1 23134"
                    };

foreach(var input in myList)
{
    var splitted = Regex.Split(input, @"\s+"); // Split on whitespace

    var length = splitted.Sum(x => x.Length); // Compute the total length
    var smallestGroupSize = splitted.Min(x => x.Length); // Compute the length of the smallest chunck
    Console.WriteLine($"Total lenght: {length}, smallest group size: {smallestGroupSize}");

    if (length < 13 || length > 19 || smallestGroupSize < 3)
    {
        Console.WriteLine($"Input '{input}' is incorrect{Environment.NewLine}");
        continue;
    }

    Console.WriteLine($"Input '{input}' is correct!{Environment.NewLine}");
}

产生:

  

总长度:13,最小团体规模:13   输入&#39; 1234567890123&#39;是对的!

     

总长度:15,最小群体规模:3   输入&#39; 1234 5678 9012 345&#39;是对的!

     

总长度:13,最小群体大小:1   输入&#39; 123456789012 3&#39;是不正确的

     

总长度:14,最小群体大小:1   输入&#39; 123 12 123 1 23134&#39;是不正确的