2017-05-14 118 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

相关问题