2012-09-25 31 views
1

我有一個Web服務構造以下模式:爲什麼我得到這個正則表達式的解析異常?

rUsername = Pattern.compile("[A-z0-9]{4,30}"); 
rPassword = Pattern.compile("[[email protected]#$%&*()=+-\\\\s]{6,30}"); 
rQuestion = Pattern.compile("[A-z0-9\\\\s?]{5,140}"); 
rAnswer = Pattern.compile("[A-z0-9\\\\s]{1,30}"); 

如果我只有2個斜線,而不是4那裏,當我部署我的web應用程序,我得到從Tomcat解析異常。

用戶名一個正常工作,但我似乎有密碼,問題和答案的問題。密碼將與「testasdas」相匹配,但不匹配「test1234」,問題不會與任何內容匹配,並且答案似乎不匹配任何內容。

我希望密碼能夠匹配小寫字母,大寫字母,數字,空格和我投入的符號。問題一應該能夠匹配小寫字母和大寫字母,數字,空格和'?',答案只是大寫和小寫字母,空格和數字。

編輯:模式已經改變了這些:

rPassword = Pattern.compile("[[email protected]#$%&*()=+\\s-]{6,30}"); 
rQuestion = Pattern.compile("[A-Za-z0-9\\s?]{5,140}"); 
rAnswer = Pattern.compile("[A-z0-9\\s]{1,30}"); 

這些都或多或少的我多麼希望,但作爲一個答案,我是在我的密碼字段非常嚴格這可能ISN指出」這是一個好主意。在我保存之前,我不會散列任何東西,因爲這是一個沒有人會使用的大學項目,我知道在現實世界中這是一個壞主意,但它不是項目要求的一部分。然而,我不得不停止SQL注入攻擊,這就是爲什麼一切都如此嚴格。這個想法主要是禁止使用',我知道每個SQL攻擊都需要工作,但我不知道如何僅僅禁止那個字符。

+0

我認爲你的問題的第二部分(編輯過的正則表達式)應該移到一個新的問題。否則,答案不適合。 –

回答

3

讓我們來看看你的第二個正則表達式:

[[email protected]#$%&*()=+-\\\\s] 

這裏存在幾個誤區。

  • [A-z]不正確,你需要[A-Za-z]因爲有Za之間有一些ASCII字符,你可能不想匹配。但這不是你錯誤的問題。

更成問題的是這樣的部分:

+-\\\\s 

從Java字符串翻譯成實際的正則表達式,這成爲

+-\\s 

和裝置(一個字符類中)「匹配任何+\之間的字符,或任何空格「。 [+-\\]是一個有效的範圍(ASCII 43-92),但它不是你想要的。

但如果現在去掉兩個額外的反斜槓,你的性格類成爲

+-\s 

一個語法錯誤,因爲+和「任何空白」之間沒有ASCII範圍。

解決方案:使用

[[email protected]#$%&*()=+\\s-] 

或強加什麼字你的用戶可以在首位密碼選擇限制避免。

+0

+「不要限制用戶首先在密碼中選擇哪些字符」。如果我想包含希臘文/中文,那麼爲什麼不 - 如果在保存密碼之前對密碼進行哈希處理,這應該沒有什麼區別(在保存密碼之前您正在對密碼進行哈希處理,對吧?) –

+0

目前還沒有,沒有。我明白這就是你必須在現實世界中做的事情,但這是一個沒有人會使用的大學項目,所以我根本不擔心安全問題。這幾乎就是我自己和我的老師將會使用它。限制的主要原因是爲了簡化清理密碼,讓它進入我的SQL數據庫,所以我真正需要做的就是不允許''',對嗎?我不知道該怎麼做。 – Logan

0

要匹配大寫和小寫字母,你需要給模式: - [a-zA-Z]

試着改變你的模式: - [a-zA-Z0-9\\s]{1,30}你的答案..

對於你的問題,不採取空白,你可以使用\\S - 非空白字符 [a-zA-Z0-9\\S]{1,250} 我認爲它應該工作。您可以作出相應的更改其餘2

*編輯: - 您還可以使用\\p{Z}匹配任何空白字符..

爲使用Java正則表達式的一個很好的教程參見this link ..

+0

在java'\ s'中是無效的,因爲它被解釋爲一個轉義字符,所以你必須使用'\\'來通過一個'\'發送,這就是我通常使用'\\ s'的原因。我在我的OP中說過,如果我剛使用'\\ s',並且'\\\ s'使得錯誤消失,我從tomcat中得到了一個解析錯誤。編輯:擺脫了我的模式中的最後一個' - ',現在'\\ s'正在工作。 – Logan

+0

是'\ s'是一個匹配'Space'的轉義字符..如果你真的想把'\ s'放在你的字符串中,你只需要用一個額外的'反斜槓'使它成爲'\\ s'。 –

+0

它實際上應該是\\ s。 \ s會給編譯器錯誤是不是有效的回車 – PermGenError

相關問題