Groovy中的正则表达式未返回预期结果

时间:2017-05-14 14:36:21

标签: regex 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脚本会输出false。也许我没有逃避我应该做的事情?我使用的是斜线字符串,所以我不确定为什么这不起作用?

如果有人能够找出对我有帮助的错误。

感谢

2 个答案:

答案 0 :(得分:2)

由于\w[a-zA-Z_0-9]匹配,您可以采用以下有序(和简明)方法:

  • 从不区分大小写标志开始:(?i)。既然没有被撤销, 它“正常”直到正则表达式结束。
  • 关于单个数字和字母放置两个正向前瞻 放在任何地方:(?=.*[\d])(?=.*[a-z])
  • 对3个“禁止的”字符提出否定的预测,但你必须这样做 禁止“_”,与\w匹配(见下文):(?!.*[ioq_])
  • 将主要条款放在17个字的字符上:[\w]{17}(而不是 分别提到字母和数字,记住“_”是 禁止早些时候)。

^$不需要,因为==~会检查整个文字     与正则表达式相匹配。

总结正则表达式可以是:(?i)(?=.*[\d])(?=.*[a-z])(?!.*[ioq_])[\w]{17}

答案 1 :(得分:1)

看起来这个案例并不重要,所以你可以添加不区分大小写的标志(?i)

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