Javascript的正则表达式只允许字母和数字

332
我需要找到一个只允许字母和数字的正则表达式。到目前为止,我尝试过的所有正则表达式都只在字符串是字母数字混合时起作用,这意味着既包含字母又包含数字。我只想要一个既允许字母又允许数字,而不需要两者都包含的正则表达式。
22个回答

648
/^[a-z0-9]+$/i

^         Start of string
[a-z0-9]  a or b or c or ... z or 0 or 1 or ... 9
+         one or more times (change to * to allow empty string)
$         end of string    
/i        case-insensitive

更新(支持通用字符)

如果您需要此正则表达式支持通用字符,可以在这里找到unicode字符列表。

例如:/^([a-zA-Z0-9\u0600-\u06FF\u0660-\u0669\u06F0-\u06F9 _.-]+)$/

这将支持波斯语。


59
[a-z]不匹配国际字符。 - Eric Normand
30
哇——我觉得在以这种简单的方式分解之前,我从未彻底理解正则表达式。谢谢! - Matt Cashatt
6
另一种方法是 [^\W_],但 [a-z0-9]/i 是一个明显的选择。 (注:此句话在讨论正则表达式的语法选项,其中 [\W_] 匹配任何非单词字符或下划线,而 [^\W_] 则匹配任何字母数字字符。作者提到 [\W_] 作为备选方案,但 [a-z0-9]/i 更为直观易懂,可以作为首选方案。) - Vitim.us
42
@Greg,我很喜欢你解释与正则表达式相关的答案的方式。在我看来,没有解释的正则表达式有点没用。因为当你需要更改它时,你只是在不同的用例下试错,而不是真正理解正则表达式的作用。此外,你比正则表达式文档更容易理解 :P - Chris Cirefice
这对我不起作用。相反,我使用了/[^\w]|_/g - christo8989
显示剩余9条评论

202
如果你想返回替换后的结果,那么可以这样做:

var a = 'Test123*** TEST';
var b = a.replace(/[^a-z0-9]/gi, '');
console.log(b);

这将返回:

Test123TEST

请注意,gi是必需的,因为它表示全局(不仅仅是第一个匹配),并且是大小写不敏感的,这就是为什么我使用a-z而不是a-zA-Z。方括号内的^表示“不在这些方括号中的任何字符”。 警告:如果您需要的确实是字母数字字符,那么这个方法很好。但是,如果您将其用于国际市场上的人名或地理区域等情况,则需要考虑Unicode字符,而这种方法无法处理。例如,如果有一个名字叫"Âlvarö",它会变成"lvar"。 更新:要支持Unicode字母数字字符,可以将正则表达式更改为:/[^\p{L}\p{N}]/giu

6
这是一个很好的答案,附有解释。请记得如果需要的话要留出空格。.replace(/[^a-z0-9\ ]/gi,'') - Joe Johnston

109

使用单词字符类。以下正则表达式等同于 ^[a-zA-Z0-9_]+$:

^\w+$

解释:

  • ^ 字符串开始处
  • \w 任何单词字符(A-Z、a-z、0-9、_)。
  • $ 字符串结束处

如果不想匹配下划线,请使用/[^\w]|_/g


25
"\w" 实际上等同于 "[a-zA-Z_0-9]",因此您的正则表达式也会匹配下划线 [_]。 - Martin Brown
几乎是字母数字的并不完全是字母数字,但感谢你的答案帮了我很多。 - ajax333221
真的,这不是对所发布问题的严格回答,但却正是我所寻找的。 - prototype
抱歉,但是这不匹配国际字符,比如Ä。 - Alex Mi

47
/^([a-zA-Z0-9 _-]+)$/

以上正则表达式允许字符串中包含空格,并限制特殊字符。它仅允许a-z、A-Z、0-9、空格、下划线和破折号。


17

为了支持多语言:

var filtered = 'Hello Привет 你好 123_456'.match(/[\p{L}\p{N}\s]/gu).join('')
console.log(filtered) // --> "Hello Привет 你好 123456"

这将匹配大多数语言中的任何字母、数字或空格。

  • [...] -> 满足某些条件进行匹配
  • [ab] -> 匹配 'a' 或 'b'
  • \p{L} -> 匹配任何语言中的字母
  • \p{N} -> 匹配任何语言中的数字
  • \s -> 匹配空格
  • /g -> 不止匹配第一次符合条件的结果
  • /u -> 支持Unicode模式匹配

参考: https://javascript.info/regexp-unicode


1
[a|b] 匹配 a|b。不要与 (a|b) 混淆!'ab|cd'.match(/(ab|cd)/gu) 返回 ['ab', 'cd'],而 'ab|cd'.match(/[ab|cd]/gu) 返回 ['a', 'b', '|', 'c', 'd']。因此,正确的正则表达式应该是 /[\p{L}\p{N}\s]/gu(不带 |)。 - Tino
点赞以显示\p{L} - killdash9

16
^\s*([0-9a-zA-Z]*)\s*$

或者,如果你想要至少一个字符:

^\s*([0-9a-zA-Z]+)\s*$

方括号表示一组字符。^表示输入的开头,$表示输入的结尾(或换行符,具体取决于您的选项)。\s表示空白字符。

前后的空白字符是可选的。

圆括号是分组运算符,允许您提取所需信息。

编辑:删除了我错误使用的\w字符集。


12

这将有效运作

^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9]+$

它只接受单独的字母数字字符:
测试用例通过:

dGgs1s23 - valid
12fUgdf  - valid,
121232   - invalid, 
abchfe   - invalid,
 abd()*  - invalid, 
42232^5$ - invalid

或者

您也可以尝试这个表达式。它至少包含一个数字和一个字符,且没有其他特殊字符。

^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]+)$

在Angular中可以像这样进行测试:

$scope.str = '12fUgdf';
var pattern = new RegExp('^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]+)$');
$scope.testResult = pattern.test($scope.str);

PLUNKER演示

参考自:Angularjs中的字母数字正则表达式


6

不需要检查有效的字母数字字符串,您可以通过检查字符串中是否存在任何无效字符来间接实现此目的。通过检查与有效的字母数字字符串补集匹配的任何内容来实现。

/[^a-z\d]/i    

这里有一个例子:

var alphanumeric = "someStringHere";
var myRegEx  = /[^a-z\d]/i;
var isValid = !(myRegEx.test(alphanumeric));

注意isValid处的逻辑非运算符,因为我测试的是字符串是否为false,而不是它是否有效。


5
我有一个类似于三星Galaxy A10s 6.2英寸(2GB,32GB ROM)Android 9.0,(13MP+2MP)+8MP双卡双待4000mAh 4G LTE智能手机-黑色(BF19)的字符串。

以下是我做的:

string.replace(/[^a-zA-Z0-9 ,._-]/g, '').split(',').join('-').split(' ').join('-').toLowerCase()

注意,我允许使用,._-,然后使用split()join(),替换为-,将空格分别替换为-

最终得到的结果如下: samsung-galaxy-a10s-6.2-inch-2gb-32gb-rom-android-9.0-13mp-2mp-8mp-dual-sim-4000mah-4g-lte-smartphone-black-bf19-20 这就是我想要的内容。

可能有更好的解决方案,但这对我来说已经很好了。


4
扩展字符串原型以在整个项目中使用
    String.prototype.alphaNumeric = function() {
        return this.replace(/[^a-z0-9]/gi,'');
    }

使用方法:

    "I don't know what to say?".alphaNumeric();
    //Idontknowwhattosay

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