2016-05-12 85 views
1

我有一個Grails配置限制的重複位的正則表達式:正則表達式以限制重複的數字

password.regex = /^(?!.*([0-9])\1{2,})/ 

能正常工作時,我測試此在https://regex101.com/。不過,這並不在我們的JS代碼,因爲它修改了正則表達式的工作:

var passRegex = /(${ConfigurationHolder.config.password.regex})/; 

所以結果是這樣的,而不是:

/(^(?!.*([0-9])\1{2,}))/ 

不幸的是,我不能改變的js代碼,所以我只會依賴修改配置。有人可以幫我修改這個表達式

/(^(?!.*([0-9])\1{2,}))/ 

使預期不除去第一對開啓和關閉括號它會奏效。

+0

那些外括號不會造成任何傷害。 –

+0

嗨,但是當我在regex101.com上測試這個正則表達式/(((((!!.*([0-9])\1{2,}))/時,它並不像預期的那樣工作,與/ ^(?! 。*([0-9])\ 1 {2,})/ – SpongebobJunior

+0

啊,我明白了,反向引用。所以,只需用'\ 2'替換'\ 1'。嘗試'password.regex =/^(?!。*([0-9])\ 2 {2,})/'。所以,你不能把'var passRegex = /($ {ConfigurationHolder.config.password.regex})/;'改成'var passRegex =/$ {ConfigurationHolder.config.password.regex} /;',可以嗎? –

回答

1

邏輯的解決辦法是從你的代碼刪除外括號,像var passRegex = /${ConfigurationHolder.config.password.regex}/;

如果它不是一個選項,只需將\1替換爲\2作爲具有要檢查的位數的組會被移位並獲取新的ID = 2,password.regex = /^(?!.*([0-9])\2{2,})/

+0

謝謝。你能解釋爲什麼它會「轉移」嗎? – SpongebobJunior

+0

我不知道你的系統在內部對你定義的正則表達式有什麼作用。重點在於反向引用指向使用特定捕獲組捕獲的文本。這些組從左到右編號,從1開始。所以,你的外括弧形成組1,圍繞'[0-9]'的括號形成組2.你需要引用組2,所以'1'必須改爲'\ 2'。 –