Java中的RegEx帮助

时间:2013-03-22 03:33:43

标签: java regex

我需要一个可以根据以下条件验证字符串的正则表达式。

  • 该字符串必须仅包含大写字母。
  • 必须至少包含6个字符,最多包含20个字符。
  • 必须以子字符串开头 - ROLE(仅限大写)后跟下划线字符,如ROLE _
  • 下划线字符必须出现在字符串的末尾(两者都不在开头)。
  • 其余字符只能是大写字母和下划线的组合,例如ROLE_ADMIN,ROLE_USER,ROLE_AGENT_USER。
  • 不允许连续两次或多次下划线。

因为我对regexp知之甚少,所以到目前为止我所尝试的例子都是非常不可接受的,而且我觉得,这些都没有必要在这里呈现。

3 个答案:

答案 0 :(得分:3)

这是我的正则表达式。

(?!.*__.*)(?!.*_$)(ROLE_[A-Z_]{1,15})

以下是它的作用:

  • 前面的那些部分被称为negative lookaheads.如果其中有两个以上的连续下划线,或者如果最后有一个下划线,则拒绝该字符串。
  • 下一组匹配逐字字符串ROLE_,然后匹配任何其他字符A-Z和下划线,至少一次但不超过15次。这样可以使整个字符串长度保持在20或更小。

Here's what it looks like on Debuggex.

答案 1 :(得分:3)

IMO,使用正则表达式检查字符串的长度会使其变得复杂,但您可以使用以下内容:

^ROLE_(([A-Z]+_)*[A-Z]+)(?<!.{21})$

(?<!.{21})基本上拒绝字符串,如果它的长度超过20

Here是Rubular的演示。


如果你的正则表达式不支持负面的外观,你可以使用

^(?!.{21,})ROLE_(([A-Z]+_)*[A-Z]+)$

(?!.{21,})(?<!.{21})的作用相同,但会先检查长度。

Here是Rubular的演示。

答案 2 :(得分:-1)

这应该可以解决问题:

ROLE(_[A-Z]+)+

这不会限制最大长度,但我认为这是你最接近的。