使用条件正则表达式

问题描述:

我有问题,我只能使用一个Regex.IsMatch来验证字符串,我必须使用正则表达式来匹配相同的字符串,我看,似乎我可以使用正则表达式条件像(?(?=regex)then|else)匹配的字符串值,这两个正则表达式,但我不能达到同样的效果使用条件正则表达式

我有两个正则表达式验证工作实际的代码是:

bool flag = false; 
if (Regex.IsMatch(alias, "^[a-zñA-ZÑ_0-9-.]{6}[a-zñA-ZÑ_0-9-.]*$")) 
{ 
    if (Regex.IsMatch(alias, "[^0-9.-]+")) 
    { 
     flag = true; 
    }; 
}; 

,我想达到什么是像这样:

if (Regex.IsMatch(alias, "(?(^[a-zñA-ZÑ_0-9-.]{6}[a-zñA-ZÑ_0-9-.]*$)([^0-9.-]+))")) 
{ 
    // Some code... 
}; 

所以如果你能给我一些指导,或者如果我正则表达式是正确的使用条件的正则表达式检查将赞赏

+0

如果你给我们,什么不能的你想匹配,而不是仅仅出现什么工作什么的例子可能会更好。很难从你发布的代码中知道你想要达到的目标。 – 2010-08-12 20:09:14

+0

例如:有效期:12pl58,-sdfgl.fdo,-1313.5m64,Name_is_this 无效:娟,-1523.32,1523.3002 感谢您的帮助,帮助 – David 2010-08-12 21:05:06

你的第一个正则表达式:

^[a-zñA-ZÑ_0-9-.]{6}[a-zñA-ZÑ_0-9-.]*$ 

说,0-9。 - 是允许的,而第二个说0-9 .-是不允许的。为什么不只是改变了第一个:

^[a-zñA-ZÑ_]{6}[a-zñA-ZÑ_]*$ 

和更简单:

^[a-zñA-ZÑ_]{6,}$ 

,因为这两个部分都是相等

[编辑 - 代码示例]

艾伦的回答可能是最优雅的,但你也可以这样做:

bool flag = false; 
Match m = Regex.Match(alias, "(?<main>^[a-zñA-ZÑ_0-9-.]{6,}$)|(?<char>[^0-9.-])"); 
if (m.Groups["main"].Success && m.Groups["char"].Success) 
{ 
    flag = true; 
}; 

也就是说,将正则表达式分解为多个部分通常会更好。它使它更具可读性,每个表达式都会做一件事。只要你一秒钟不执行一百万次表达式,运行多个正则表达式的开销就很小。

+0

感谢,但事实是,我解析字符串可以有数字,但我必须验证它至少有一个字符不是数字,并且感谢简化符regexp – David 2010-08-12 20:37:06

+0

当应用第二个正则表达式时,该字符串已经被第一个匹配,因此'[^ 0- 9 .-] +'只是确保字符串中至少有一个字符是字母或下划线而不是数字,点或短划线。 – 2010-08-13 03:04:39

+0

@alan:true。一旦我到达电脑,我会解决我的答案。在我的手机上编写代码非常麻烦。 – 2010-08-13 08:04:50

你需要的是前瞻,而不是条件。注意:

^(?=.*[a-zñA-ZÑ_])[a-zñA-ZÑ_0-9.-]{6,}$ 

先行 - (?=.*[a-zñA-ZÑ_]) - 声称是在某个地方字符串中的字符列的至少一个。完成后,匹配位置返回到字符串的开头,所以“真正的”正则表达式可以匹配整个事物。

有关向前看符号的更多信息:http://www.regular-expressions.info/lookaround.html