2

新手来了 尝试从左侧提取值,仅当在右侧找到但未捕获到 5 位数字时。任何方向将不胜感激。

例子:

Hello Industries                         12345

我需要找到 5 位数字,然后获取公司名称。

4

3 回答 3

4

使用前瞻, (?=), 来查找但不捕获它。

.+(?=\s+\d{5})

你可以看到这个正则表达式使用这个在线工具工作。

于 2013-07-08T18:15:59.390 回答
1

使用匹配组。

using System;
using System.Text.RegularExpressions;
public class Test
{
  public static void Main()
  {
    string test = "Hello Industries 12345 Another One 54321";
    var matches = Regex.Matches(test, @"(?<=(\d{5}\s+|^))(?<NAME>.*?)\s+(?<NUMBER>\d{5})");
    foreach(Match m in matches)
    {
      Console.WriteLine(string.Format("Name: {0} #: {1}", 
        m.Groups["NAME"].Value, 
        m.Groups["NUMBER"].Value));
    }
  }
}
于 2013-07-08T18:25:37.530 回答
0

使用零宽度正向前瞻断言来查找出现在表达式之前的一些内容。表达式本身不会被捕获(因此名称为“零宽度”)。

(\w+)(?=\s+\d{5})

这将找到一个出现在 5 位数字之前的单词([a-zA-Z0-9_]加上一些unicode 内容)。

我会根据您的格式猜测您有一个以换行符分隔的客户列表,并附加了客户 ID。如果是这种情况,您可以结合使用以下模式和Multiline 选项来查找特定客户:

^.+(?=\s+12345)

如果您尝试从客户名称后跟 5 位客户 ID 的文档中提取客户名称,则可以使用以下内容(假设客户名称大写):

([\p{Lu}\p{Lt}\p{Lo}]\w*\s+)+(?=\d{5})

这将找到一个或多个以大写、标题大小写或“其他”大小写字符(不包括小写字母)开头的单词。

于 2013-07-08T18:16:26.593 回答