-3

我们的文件名在开始时包含产品编号,基于此我们在将它们添加到系统时应用处理

我需要一个应该匹配以下内容的正则表达式

70707_70708_70709_display1.jpg
70707_Front010.jpg

而不是这些

626-this files is tagged.jpg
1000x1000_webbanner2.jpg
2000 years ago_files.jpg
626gamingassets_styleguide.jpg
70707_Front010_0001_1.jpg

我有一个正则表达式,除了下面突出显示的一种情况外,几乎可以满足我的要求

\d{3,}(?=_)



70707_70708_70709_display1.jpg - success 3 matches {70707,70708,70709}
70707_Front010.jpg -             success 1 match {70707 }
626-this files is tagged.jpg -   success 0 matches
1000x1000_webbanner2.jpg -       fail  1 match {1000}
2000 years ago_files.jpg -       success 0 matches
626gamingassets_styleguide.jpg - success 0 matches
70707_Front010_0001_1.jpg      - fail 2 matches{70707,0001}

在 regex101 有一个正则表达式测试来说明这一点

正则表达式应该只在开头寻找下划线分隔的数字集。

4

2 回答 2

1

您可以尝试非正则表达式解决方案:

var results = s.Split('_').TakeWhile(x => x.All(char.IsDigit) && x.Length >= 3).ToList();
if (results.Count > 0)
    Console.WriteLine("Results: {0}", string.Join(", ", results));
else
    Console.WriteLine("No match: '{0}'", s);

请参阅C# 演示。在这里,字符串被拆分,_然后只返回所有数字且长度为 3+ 的第一个项目。

您可以使用以下基于正则表达式的解决方案:

^(?<v>\d{3,})(?:_(?<v>\d{3,}))*_

查看正则表达式演示

图案细节

  • ^- 字符串的开头
  • (?<v>\d{3,})- 组v:3位或更多位
  • (?:_(?<v>\d{3,}))*- 0+ 次出现
    • _- 一个下划线
    • (?<v>\d{3,})- 组v:3位或更多位
  • _- 一个_

C# 演示

var lst = new List<string> {"70707_70708_70709_display1.jpg",
        "70707_Front010.jpg",
        "626-this files is tagged.jpg",
        "1000x1000_webbanner2.jpg",
        "2000 years ago_files.jpg",
        "626gamingassets_styleguide.jpg" };
foreach (var s in lst) 
{
        var mcoll = Regex.Matches(s, @"^(?<v>\d{3,})(?:_(?<v>\d{3,}))*_")
            .Cast<Match>()
            .SelectMany(m => m.Groups["v"].Captures.Cast<Capture>().Select(c => c.Value))
            .ToList();
        if (mcoll.Count > 0)
            Console.WriteLine("Results: {0}", string.Join(", ", mcoll));
        else
            Console.WriteLine("No match: '{0}'", s);
 }

输出:

Results: 70707, 70708, 70709
Results: 70707
No match: '626-this files is tagged.jpg'
No match: '1000x1000_webbanner2.jpg'
No match: '2000 years ago_files.jpg'
No match: '626gamingassets_styleguide.jpg'
于 2017-11-22T08:12:22.187 回答
0

如果数字总是在行首,这将起作用:

^\d{3,}(?=_)
于 2017-11-22T07:46:23.353 回答