C#正则表达式未正确触发

时间:2012-01-20 23:05:50

标签: c# asp.net regex pattern-matching

我为C#(3.5)ASP.NET Web应用程序编写了一堆正则表达式。无论如何,我不是高级正则表达式用户。我正在排除一个令我完全困惑的问题,因为它不起作用。特别是因为我有类似的工作正常。

以下是详细信息。感谢您的时间和帮助。

我的应用程序所做的是获取2个单独的值。如果2个值一起匹配预定义的规则集,则它们将映射到特定值。

我已经定义了一些规则(注意:这些只是由我编写而没有编程意义或含义):

元素1:Cxxxx * ####

元素2:Czzzz * ####

元素1: 这意味着该序列必须以“C”开头。接下来的4个字符(四个X)是字母数字。星号表示它可以是(“R”或“D”)。 #符号表示它可以是任意4个字母数字字符的序列。

元素2: 这意味着该序列必须以“C”开头。接下来的4个字符(四个Z)是字母数字。星号表示它可以是(“R”或“D”)。 #符号表示它可以是任意4个字母数字字符的序列。

在两个元素之间,X和Z只是意味着4个字符的序列不能相同。它必须在两者之间是唯一的。

因此,这两个元素违反了规则,因为“1491”在序列中的相同位置重复。

元素1:C1491D1234

元素2:C1491D5678

这个会返回true,因为根据序列的规则应该没问题:

元素1:C1491D1234

元素2:C1599D5678

这个会返回true,因为根据序列的规则应该没问题:

元素1:C1491D1234

元素2:C1599D1234

这是我用来创建此规则的正则表达式:

C([A-ZA-Z0-9] {4})[复员] [A-ZA-Z0-9] {4} -C(?!\ 1)[复员] [A-ZA-Z0 -9] {4}

这是我用来测试条件的两个元素:

要素1:C1491D1491

元素2:C1000R4100

出于某种原因,我的正则表达式是错误的,并且没有返回true。

这是我的C#程序看到序列的方式:C1491D1491-C1000R4100

我一直在用这个网站测试:

http://regexhero.net/tester/

2 个答案:

答案 0 :(得分:2)

你缺少匹配第二个括号的第一个字母数字集,

C([A-Za-z0-9]{4})[DdRr][A-Za-z0-9]{4}-C(?!\1)([A-Za-z0-9]{4})[DdRr][A-Za-z0-9]{4} 

匹配测试字符串。我发现这个正则表达式测试器也很好:) http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx。说完这个,确实是一种更有效的编写正则表达式的方式

答案 1 :(得分:0)

你的正则表达式有一个微妙的缺陷。 (?!\1)是一个负向前瞻:它检查第一个反向引用不重复,但不消耗新序列。您可以像这样修复代码:

@"C([A-Za-z0-9]{4})[DdRr][A-Za-z0-9]{4}-C(?!\1)[A-Za-z0-9]{4}[DdRr][A-Za-z0-9]{4}"