3

无法找出正则表达式问题。

我们正在寻找 2 个数字,然后是连字符或空格,然后是 6 个数字。只能是 6 个数字,因此 6 个数字后必须有一个字母字符或一些标点符号或空格,或者 6 个数字必须位于字符串的末尾。

字符串中的其他位置允许使用其他数字,只要它们是分开的即可。

所以,这些应该匹配:

foo 12-123456 bar  
12-123456 bar  
foo 12-123456  
foo12-123456bar  
12-123456bar  
foo12-123456  
12-123456bar 99
foo12-123456 99 

这些不应该匹配:

123-12345 bar  
foo 12-1234567  
123-12345bar  
foo12-1234567  

这是我们使用的:

\D\d{2}[-|/\ ]\d{6}\D

Expresso中这很好。

但是在我们的 .net 应用程序中实际运行时,这种模式无法匹配 6 个数字位于字符串末尾的示例。

试过这个:

\D\d{2}[-|/\ ]\d{6}[\D|$]

它仍然不匹配

foo 12-123456
4

3 回答 3

4

我会重申你的模式

只能是 6 个数字,因此 6 个数字后必须有一个字母字符或一些标点符号或空格,或者 6 个数字必须位于字符串的末尾。

必须只有 6 个数字,所以第六个数字后面不能有数字

然后使用否定的前瞻断言来表达这一点。同样,在模式的开头使用否定的后向断言来表示前两位数字之前的任何内容都不是数字。一起:

var regex = new Regex(@"(?<!\d)\d{2}[- ]\d{6}(?!\d)");

var testCases = new[]
                    {
                        "foo 12-123456 bar",
                        "12-123456 bar",
                        "foo 12-123456",
                        "foo12-123456bar",
                        "12-123456bar",
                        "foo12-123456",
                        "123-12345 bar",
                        "foo 12-1234567",
                        "123-12345bar",
                        "foo12-1234567",
                    };

foreach (var testCase in testCases)
{
    Console.WriteLine("{0} {1}", regex.IsMatch(testCase), testCase);
}

根据需要,这会产生 6 个Trues,然后是 4 个Falses。

断言(?<!\d)(?!\d)分别说“这里之前没有数字”和“这里后面没有数字”。

于 2012-05-30T10:51:58.493 回答
1

这应该这样做:

(^|\D)\d{2}[- ]\d{6}($|\D)

它查找行首或非数字,然后是您提到的 2-6 或 2 6 模式,然后是行尾或另一个非数字。

用 perl 编辑和测试,匹配前 8 个,而不是下 4 个。

C# 可能有 RegEx 的其他规范。我不确定是否或哪些更改是必要的。

于 2012-05-30T11:01:23.527 回答
0

好的,根据您进一步编辑的问题,答案如下所示:^(?:.*?\D+?)?(\d{2}[-|/\ ]\d{6})(?:\D+?.*?)?$它匹配所有字符串并捕获数字。

upd:添加了一些代码来测试并显示匹配。

MessageBox.Show(Regex.Replace(
  "1 foo 12-123456 bar\r\n12-123456 bar\r\nfo23o 12-123456\r\nfoo12-123456bar3\r\n" +
  "12-123456bar\r\nfoo12-123456\r\n\r\nThese should not match:\r\n\r\n" +
  "123-12345 bar\r\nfoo 12-1234567\r\n123-12345bar\r\nfoo12-1234567",
  @"^(?:.*?\D+?)?(\d{2}[-|/\ ]\d{6})(?:\D+?.*?)?$",
  @"[match, cap: '$1']",
  RegexOptions.Multiline
));
于 2012-05-30T10:40:10.883 回答