我为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
我一直在用这个网站测试:
答案 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}"