JavaScript中的正则表达式(regex)

Regular expression (regex) in JavaScript

本文关键字:regex 正则表达式 JavaScript      更新时间:2023-09-26

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

  • 以逐字文本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})"))
{
     //...
}

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

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

如果你想让JavaScript的match像Java的matches一样,在字符串的开始(^)和结束($)使用锚:

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

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

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