2013-05-05 160 views
0

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

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

您需要添加''^到开始和'$'到最后。另外,这不是你的问题,因为浏览器在这种情况下自动处理它,但是你应该在'/ myexpression /'中包装正则表达式而不是''myexpression'': – Dave 2013-05-05 16:18:34

+0

:-)我从js移动到java时遇到了相反的麻烦 - 添加'。*'在开始和结束时... – anishsane 2013-05-05 16:22:58

回答

1

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 
+0

'/^(?!.*__.*)(?!^ROLE_ADMIN$)(?!.*_$)(ROLE_[A-Z_]{1,15 })$ /'在有效的字符串(如'ROLE_ADMIN_S')上计算为false。 – Tiny 2013-05-05 16:28:15

+0

当我从'^(?!。* __。*)(?!^ ROLE_ADMIN $)(?!。* _ $)(ROLE_ [A-1])这样的表达式两边删除正斜杠'/' Z _] {1,15})$'。我不明白。 – Tiny 2013-05-05 16:35:58

+0

@Tiny在JavaScript中,['RegExp'对象都有一个文本语法是'/ /'](https://developer.mozilla.org/en/docs/JavaScript/Reference/Global_Objects/RegExp)。当然,如果将这些文字用作字符串,即“/ /”,分隔符“/”也被视为模式的一部分。 – Gumbo 2013-05-05 16:53:31

相关问题