使用有条件的正则表达式

时间:2010-08-12 19:54:44

标签: c# .net regex

我遇到的问题是我只能使用一个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...
};

所以,如果你能给我一些指导,或者检查我的正则表达式是否正确使用regexp中的条件,那么会很感激

2 个答案:

答案 0 :(得分:2)

你的第一个正则表达式:

^[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;
};

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

答案 1 :(得分:2)

你需要的是一个先行,而不是条件。观察:

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

前瞻 - (?=.*[a-zñA-ZÑ_]) - 断言字符串中至少有一个列出的字符。完成后,匹配位置将返回到字符串的开头,因此“真正的”正则表达式可以匹配整个事物。

有关前瞻的更多信息:http://www.regular-expressions.info/lookaround.html