无法解决正则表达式问题。
我们正在寻找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
答案 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
));