正则表达式字符串不以特殊字符开头或结尾

6

大家好,我需要实现一些密码要求,其中一个要求是不能以特殊字符开头或结尾。我花了一些时间在Google上搜索,但我的正则表达式水平比较菜。

如果您对一些代码感兴趣,这里是JavaScript代码:
注意:是的,在服务器上也会验证密码 :) 以下代码运行 RegEx 测试,并简单地检查或标记与密码规则相关联的行项目。

var validate = function(password){
        valid = true;

        var validation = [
            RegExp(/[a-z]/).test(password), RegExp(/[A-Z]/).test(password), RegExp(/\d/).test(password), 
            RegExp(/[-!#$%^&*()_+|~=`{}\[\]:";'<>?,./]/).test(password), !RegExp(/\s/).test(password), !RegExp("12345678").test(password), 
            !RegExp($('#txtUsername').val()).test(password), !RegExp("cisco").test(password), 
            !RegExp(/([a-z]|[0-9])\1\1\1/).test(password), (password.length > 7)
        ]

        $.each(validation, function(i){
            if(this == true)
                $('.form table tr').eq(i+1).attr('class', 'check');
            else{
                $('.form table tr').eq(i+1).attr('class', '');
                valid = false
            }
        });

        return(valid);

    }

我不确定这是否是错误,但我看到正则表达式RegExp(“12345678”)没有任何分隔符,可能是这个原因吗? - gitaarik
“/^[\d\w]+$/i” 有什么问题吗? - Alexander
1
@rednaw 目前的代码没有任何错误,需要实现一个新的需求。根据下面的答案看来,我需要类似于 /^[^a-z].*/ 这样的东西,但我还需要包括数字。换句话说,我要确保密码以字母或数字开头和结尾。 - pixelbobby
@pixelbobby 你可能只需要一个正则表达式来实现你想要的 - 请用语言解释一下你认为什么样的密码是有效的。 - rgvcorley
1
(^[(a-z)|(A-Z)|(0-9)]) 看起来很接近。一个有效的密码以字母数字(小写或大写)开头和结尾。在左侧的正则表达式中,我需要添加或以...结束。 - pixelbobby
@pixelbobby 请查看我下面回答的修改 - rgvcorley
3个回答

19

编辑:你需要的正则表达式是:

/^[a-zA-Z0-9](.*[a-zA-Z0-9])?$/

补充信息

在正则表达式中,^ 表示字符串的开头,$ 表示字符串的结尾。例如:

/^something$/

匹配

'something'

但不是

'This is a string containing something and some other stuff'

您可以使用[^-char to negate-]来否定字符,因此

/^[^#&].*/

匹配任何不以 # 或 & 开头的字符串。


这个答案仍然非常有帮助。 - pixelbobby
我将给@rgvcorley答案,因为他付出了最大的努力并且回答得最早,尽管rednaw也回答了(接近)并且回答速度很快。 - pixelbobby

2
/^[a-zA-Z0-9](.*[a-zA-Z0-9])?$/

这个表达式检查以下验证:

  • 开头和结尾没有空格
  • 开头和结尾没有特殊字符
  • 允许在中间使用特殊字符

如果不允许特殊字符出现在中间,正则表达式应该是什么? - jeeva

1

这个正则表达式应该是你想要的:

/^[0-9a-z].*[0-9a-z]$/

是的!^[0-9a-zA-Z].*[0-9a-zA-Z]$ - pixelbobby
3
这不会匹配像'p'或'1'这样的字符串,它们都以字符或数字开头和结尾。 - rgvcorley
你确定吗?我在上面的评论中测试了表达式,并匹配了以下内容:password1、password、1password... - pixelbobby
2
@pixelbobby 我的意思是它不匹配包含单个字母数字字符的字符串(这符合您的标准,即任何以字母数字字符开头和结尾的字符串)。 - rgvcorley
1
换句话说,上述正则表达式还有一个条件,即字符串必须至少包含2个字符。 - rgvcorley
不客气 - 正则表达式可能有些棘手,它们相当微妙,但一旦你掌握了它们,编写它们就会变得非常有趣! - rgvcorley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接