-3

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

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

由于我对正则表达式知之甚少,因此到目前为止我尝试的示例几乎是不可接受的,我觉得它们完全没有必要在这里展示。

4

3 回答 3

3

这是我的正则表达式。

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

这是它的作用:

  • 前面的那些部分称为负前瞻。 如果字符串中有两个以上连续的下划线,或者末尾有一个,他们会拒绝该字符串。
  • 下一组匹配逐字字符串ROLE_,然后是任何其他字符 AZ 和下划线,至少一次但不超过 15 次。这将整个字符串长度保持在 20 或更少。

这是 Debuggex 上的样子。

于 2013-03-22T03:47:48.353 回答
3

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

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

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

是一个关于 Rubular 的演示。


如果您的正则表达式风格不支持负面的lookbehinds,您可以使用

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

(?!.{21,})做同样的事情,(?<!.{21})但首先检查长度。

是一个关于 Rubular 的演示。

于 2013-03-22T04:03:37.670 回答
-1

这应该可以解决问题:

ROLE(_[A-Z]+)+

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

于 2013-03-22T03:37:31.357 回答