2010-08-12 73 views
0

我有問題,我只能使用一個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

回答

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

也就是說,將正則表達式分解爲多個部分通常會更好。它使它更具可讀性,每個表達式都會做一件事。只要你一秒鐘不執行一百萬次表達式,運行多個正則表達式的開銷就很小。

+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

2

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

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

先行 - (?=.*[a-zñA-ZÑ_]) - 聲稱是在某個地方字符串中的字符列的至少一個。完成後,匹配位置返回到字符串的開頭,所以「真正的」正則表達式可以匹配整個事物。

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