2017-05-14 44 views
1

我一直在處理正則表達式,並滿足以下要求。Groovy中的正則表達式不返回預期的結果

// Must be exactly 17 characters 
    // Must only contain letters and numbers 
    // Cannot contain the letters ‘I’, ‘O’ or ‘Q’ 
    // Must contain at least 1 alpha and 1 numeric character. 

由於一些幫助在另一個話題,我設法得到

/^(?=.*[0-9])(?=.*[a-zA-Z])([a-hj-npr-z0-9]{17})$/

我能夠證實這是每https://regex101.com/r/cVz4b9/4/正則表達式。

由於某些原因,當我在Groovy中嘗試這個時,雖然我沒有得到相同的結果。

def regex = /^(?=.*[0-9])(?=.*[a-zA-Z])([a-hj-npr-z0-9]{17})$/ 
println​ ('B1cCdDeEfFgGhHwww' ==~ regex)​​​ 

例如下面的Groovy腳本在我期待爲true時打印出假。也許我不是逃避我應該的東西?我使用斜槓字符串,所以我不知道爲什麼這不起作用?

如果有人可以挑出哪些問題會對我有所幫助。

感謝

+1

我想你忘了提及區分大小寫。否則使用'[a-hA-Hj-nJ-NpPr-zR-Z0-9]'。 – Rahul

+1

爲什麼不把它作爲4個單獨的步驟,而不是一個可怕的步驟,當你回來更新它時,如果有人有另一個瘋狂的規則添加 –

+0

,你會恨自己的。我開始認爲我自己 – Richie

回答

1

看來,情況並沒有你的榜樣重要,所以你可以只添加不區分大小寫標誌(我)

def regex = /^(?=.*[0-9])(?=.*[a-zA-Z])((?i)[a-hj-npr-z0-9]{17})$/ 
2

由於\w比賽[a-zA-Z_0-9],你可以採取以下有序(簡明)的方法:

  • 以大小寫不敏感標誌開始:(?i)。由於沒有被撤銷,所以 它「工作」直到正則表達式結束。
  • 將兩個積極的lookaheads放在一個數字和字母 放置在任何地方:(?=.*[\d])(?=.*[a-z])
  • 對3個「禁止」字符給出負面看法,但您必須 也禁止「_」,匹配\w(見下文):(?!.*[ioq_])
  • 放置有關17個單詞字符的主要子句:[\w]{17}(而不是 分別提及字母和數字,請記住,先前禁止「_」爲 )。不需要

^$,由於==~檢查是否整個文本 由正則表達式匹配。

總結正則表達式可以是:(?i)(?=.*[\d])(?=.*[a-z])(?!.*[ioq_])[\w]{17}

+0

謝謝。這是一個很棒的答案。我將另一個標記爲接受,因爲它與我已有的非常接近。但這個答案給了我很多的學習。 – Richie

相關問題