允许字母数字、-、_和空格的正则表达式

64
我正在寻找一个正则表达式,以允许JavaScript / jQuery中的字母数字字符,-,_或空格。

2
尝试使用/[a-z\d\-_\s]+/i。但你可能想要“学习”正则表达式。你无法在网上找到所有的正则表达式,特别是如果它不常见。 - elclanrs
是的,我在这方面非常薄弱。 - rahul
@elclanrs 对我不起作用。 - rahul
2
是的,我忘了起始和结束字符:/^[a-z\d\-_\s]+$/i。这就是为什么了解正则表达式很有用... 我在这里学到了http://regular-expressions.info。 - elclanrs
1
@elclanrs 是的,它正在工作,请将您的解决方案发布为答案,以便我可以将其标记为已接受。 - rahul
10个回答

107

字符集在这里非常有用。你需要为要验证的字符创建一个匹配集:

  • 您可以使用\w匹配由字母和数字组成的字符串,在JavaScript中相当于[A-Za-z0-9_](其他语言可能不同)。
  • 这会留下- 和空格,它们可以被组合成匹配集,如[\w\- ]。但是,您可能希望考虑使用\s而不仅仅是空格字符(\s也匹配制表符和其他形式的空白)。
    • 请注意,我将 - 转义为 \-,以便正则表达式引擎不会将其与像A-Z这样的字符范围混淆
  • 最后,您可能希望通过使用^$来锚定字符串的开头和结尾,从而确保整个字符串与匹配
你可能在找的完整正则表达式是:
/^[\w\-\s]+$/

请注意,+表示至少要有一个字符才能匹配;如果零长度字符串也可以,则使用*

最后,http://www.regular-expressions.info/是一个很棒的参考资料


加分项: 此正则表达式 不匹配 非ASCII字符。不幸的是,大多数浏览器中的正则表达式引擎不支持命名字符集,但有一些库可以帮助解决这个问题

对于支持命名字符集的语言/平台,您可以使用/^[\p{Letter}\d\_\-\s]+$/


3
这个比我的回答更好,因为 [a-z[0-9]_]/i\w 是相同的。 - elclanrs
当我们将空格作为第一个字符时,这个程序无法正常工作。 - FrontEndDeveloper

73

尝试使用这个正则表达式:

/^[a-z\d\-_\s]+$/i

4
这个方法可以运行,但请查看 Nevir 的答案,因为它也应该可行并且更简短。基本上,\w 表示字母和下划线,这只是像 \d 表示 [0-9] 一样的快捷方式。 - elclanrs
1
尝试使用这个正则表达式 /^[\w]+([-_\s]{1}[a-z0-9]+)*$/i,它可以使文本中只包含单个空格、破折号或下划线。例如:atoz-some word_1234。 - kva

12
/^[-\w\s]+$/

\w 匹配 字母数字下划线

\s 匹配 空格制表符换行符

- 匹配连字符(如果你的字符集中有连字符,例如[a-z],请务必将连字符放在开头,如此[-a-z])


10
var string = 'test- _ 0Test';
string.match(/^[-_ a-zA-Z0-9]+$/)

4
var regex = new RegExp("^[A-Za-z0-9? ,_-]+$");
            var key = String.fromCharCode(event.charCode ? event.which : event.charCode);
            if (!regex.test(key)) {
                event.preventDefault();
                return false;
            }

在正则表达式[A-Za-z0-9?spaceHere,_-]中,问号'?'后面有一个空格,这个正则能够匹配空格。其他的正则表达式,如/^[-\w\s]+$//^[a-z\d\-_\s]+$/i对我来说并不起作用。

这允许基本的特殊字符,如 " ", ?,: .... 并阻止其他字符。谢谢。 - Rigin

4

请尝试这个正则表达式

*更新过的正则表达式

/^[a-z0-9]+([-_\s]{1}[a-z0-9]+)*$/i

这将只允许文本之间有单个空格或“-”或“_”

Ex: this-some abc123_regex

了解: https://regexr.com

*注意:我已根据Toto的问题更新了正则表达式。


你为什么想匹配单个空格、连字符或下划线?这不是被要求的内容。而且你的正则表达式匹配了_______ - Toto
我有理由这样做。 假设有一个用户名字段,使用@elclanrs正则表达式(第一个答案)。在这种情况下,实时用户可以在他的用户名字段中简单地输入“---_ _ _”,并且验证将通过,这是完全错误的。 因此,为了避免这种情况,我已经给出了带有条件的正则表达式。 - kva
但是你的正则表达式匹配了“____”,这是错误的,请参考我之前评论中提供的链接。 - Toto
它总是匹配 _____(末尾有一个空格)。 - Toto
现在不允许使用特殊字符,除了连字符和下划线。 - kva

0

对我来说,我想要一个支持字符串作为前缀的正则表达式。基本上,目的是支持一些外国国家的邮政格式,应该是允许带空格的字母数字组合。

  1. ABC123
  2. ABC 123
  3. ABC123(space)
  4. ABC 123 (space)

所以我最终编写了以下自定义正则表达式。

/^([a-z]+[\s]*[0-9]+[\s]*)+$/i

enter image description here

在这里,我使用了[\s]*中的*,因为有没有空格都是可选的。在我的情况下,邮政编码可能包含或不包含空格。

0
var1 regex = new     RegExp1("^[A-Za-z0-9? ,_-]+$");
var1 key = String1.fromCharCode(event1.charCode ? event1.which : event1.charCode);

if (!regex1.test(key)) {
  event1.preventDefault();
  return false;   
}

1
你的回答可以通过添加更多关于代码的信息以及它如何帮助提问者来改进。 - Tyler2P
1
此答案被标记为低质量,可能需要解释。以下是一些如何撰写好的答案?的指南。仅有代码的答案不被认为是好的答案,并且很可能会因为对学习者社区不够有用而被投票降低或删除。这只是对你来说很明显。请解释它的作用,以及它与现有答案的不同之处/ 优点来自审查 - Trenton McKinney

-1

以下两种方法对我都有效。

/[^a-zA-Z0-9\-_\s]/g
/[^a-z\d\-_\s]+$/i

可以将除了字母数字、-和_之外的其他字符替换为空,就像这样。

inputString.replace(/[^a-zA-Z0-9\-_\s]/g,"");

-1

尝试使用以下正则表达式来允许字母数字和空格

[a-zA-Z0-9 ]


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