0

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

  • 从逐字文本 ROLE_ 开始。
  • 只允许使用大写字母和取消划线的组合。
  • 必须包含最少 6 个字符,最多 20 个字符。
  • 不允许使用两个或多个连续的下划线。
  • 不允许使用前导和/或尾随下划线。
  • 不允许使用文本 ROLE_ADMIN。

因此,以下正则表达式适用于 Java。

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

但是在 JavaScript 中,像ROLE_ADMIN_s(s在小写的末尾) 这样的字符串被视为实际上不应该的有效字符串。最大允许字符 (20) 也未正确验证。

我正在使用match()类似的功能,

if($("#txtAuthority").val().match("(?!.*__.*)(?!^ROLE_ADMIN$)(?!.*_$)(ROLE_[A-Z_]{1,15})"))
{
     //...
}
4

1 回答 1

1

Java 的matches方法期望模式匹配整个字符串,而 JavaScript 的match方法是一种查找任何匹配方法,因为它足以在字符串中的某个位置找到模式。

"ROLE_ADMIN_s".match(/(?!.*__.*)(?!^ROLE_ADMIN$)(?!.*_$)(ROLE_[A-Z_]{1,15})/)[0] === "ROLE_ADMIN_"

如果您希望 JavaScriptmatch像 Java 一样matches,使用锚点作为字符串的开始 ( ^) 和结束 ( ):$

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

这将在您的字符串上失败:

"ROLE_ADMIN_s".match(/^(?!.*__.*)(?!^ROLE_ADMIN$)(?!.*_$)(ROLE_[A-Z_]{1,15})$/) === null
于 2013-05-05T16:19:18.833 回答