限制数字字符的正则表达式是什么?

时间:2012-05-30 10:26:09

标签: .net regex expresso

无法解决正则表达式问题。

我们正在寻找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

3 个答案:

答案 0 :(得分: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);
}

根据需要,这会产生六个True个,然后是四个False

断言(?<!\d)(?!\d)分别表示“此前没有数字”和“此后没有数字”。

答案 1 :(得分:1)

这应该这样做:

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

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

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

C#可能具有RegEx的其他特定功能。我不确定是否需要或哪些更改。

答案 2 :(得分: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
));