2010-12-13 168 views
1

我想用正則表達式來檢查一個名字,但是我沒有得到令人信服的結果。任何人都可以請建議我在我的正則表達式模式中做了什麼錯誤?正則表達式混淆

foreach(Match m in 
(Regex.Matches("Jack_Sparrow","^[A-za-z]+[^-]*(\\d)*$"))) 
    { 
     Console.WriteLine("{0} found at index{1}",m.Value,m.Index); 
    } 

可我知道爲什麼我得到Jack_Sparrow作爲輸出,儘管不圖案檢查下劃線(_)的?我寧願要Jack Sparrow作爲輸出。我需要什麼修改?

+1

聽起來像你*需要*做的是'str_replace(「_」,「」,$ username)''。但除非你更好地描述你的問題,或者再舉幾個例子,否則誰都不會知道。 – mpen 2010-12-13 06:36:59

回答

1

您的字符範圍的前半部分是包括它

[A-za-z]從下殼體創建一個從上殼A中的範圍到下殼體Z,然後另一個範圍以小寫字母z表示,這些範圍在第二部分重疊,這是因爲ASCII值的工作方式,具體來說,A-z創建了從ASCII字符65(A)到字符12 2(z)。下劃線字符的值爲95,介於兩者之間。由於你的正則表達式被錨定,所以這個字符類別爲is where the match is occurring。我已經改變了你的角色類,在這個例子中包含了組合括號,這樣你就可以看到它正在捕獲「Jack_Sparrow」的全部文本。

您應該可以通過將字符範圍更改爲[A-Za-z]來解決此特定匹配問題。但是,它仍然會匹配第一部分(「傑克」),然後[^-]*部分將匹配字符串的其餘部分(「_Sparrow」),仍然使其成爲有效匹配。如果您可以提供一些其他文本示例,那麼我們可以幫助您進一步細化。根據您提供的當前信息,很難說明如何最好地解決[^-]問題。

+0

查爾斯仍然是對的,即使他解決了這個問題,它也會因'[^ - ]'而繼續匹配。 – mpen 2010-12-13 06:29:19

+0

@Ralph:是的,只是指出。我以前應該提到過。 – eldarerathis 2010-12-13 06:30:18

+0

錯誤..不是真的。他用'$'結束他的正則表達式。它必須匹配到字符串的末尾,否則它將不匹配。這將*不匹配只有「傑克」。 – mpen 2010-12-13 06:34:11

1

[^-]檢查除 - 以外的任何字符,以便匹配下劃線。我不確定你想在這裏匹配什麼。

您是否試圖將字母以外的所有內容都改爲空格?在 (Regex.Matches

+0

如果我省略[^ - ],然後我將「Jack_Sparrow」作爲輸出。我可以知道爲什麼嗎? – Justin 2010-12-13 06:25:02

0

的foreach(匹配度M( 「Jack_Sparrow」, 「[^ A-ZA-Z]」)) { Console.WriteLine( 「{0}發現在索引{1}」, m.Value,m.Index); }