我需要找到一个只允许字母数字的reg ex。到目前为止,我尝试的每个人都只在字符串是字母数字的情况下工作,意思是既包含字母又包含数字。我只想要一个既允许其中一种,又不要求两者兼得的。
当前回答
与检查有效的字母数字字符串不同,可以通过检查字符串中的任何无效字符来间接实现这一点。通过检查与有效字母数字字符串的补码匹配的任何内容来执行此操作。
/[^a-z\d]/i
这里有一个例子:
var alphanumeric = "someStringHere";
var myRegEx = /[^a-z\d]/i;
var isValid = !(myRegEx.test(alphanumeric));
注意isValid处的逻辑not运算符,因为我测试的是字符串是否为假,而不是它是否有效。
其他回答
^\s*([0-9a-zA-Z]*)\s*$
或者,如果你想要最少一个字符:
^\s*([0-9a-zA-Z]+)\s*$
方括号表示一组字符。^是输入的开始。$是输入的结束符(或换行符,取决于您的选项)。\s是空格。
前面和后面的空格是可选的。
圆括号是分组操作符,允许您提取所需的信息。
编辑:删除了我的错误使用\w字符集。
我有类似于三星Galaxy A10s 6.2英寸(2GB,32GB ROM) Android 9.0,(1300万+ 200万)+ 800万双卡4000mAh 4G LTE智能手机-黑色(BF19)
以下是我所做的:
string.replace(/[^a-zA-Z0-9 ,._-]/g, '').split(',').join('-').split(' ').join('-').toLowerCase()
注意,i允许。然后使用split()和join()分别替换,to -和空格to -。
我最终得到了这样的东西: samsung-galaxy-a10s-6.2英寸-2gb-32gb-rom-android-9.0-13mp-2mp-8mp-dual-sim-4000mah-4g-lte-smartphone-black-bf19-20,这就是我想要的。
可能有更好的解决方案,但这是我发现工作对我很好。
这是可行的
^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9]+$
它只接受字母数字字符单独: 通过的测试用例:
dGgs1s23 - valid
12fUgdf - valid,
121232 - invalid,
abchfe - invalid,
abd()* - invalid,
42232^5$ - invalid
or
你也可以试试这个。这个表达式至少满足一个数字和一个字符,而不满足其他特殊字符
^(?=.*[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);
恰好演示
参考:Angularjs中字母数字的正则表达式
/^[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
更新(支持通用字符)
如果您需要这个regexp支持通用字符,您可以在这里找到unicode字符列表。
美国小妞example: / ^(黑a-zA-Z0-9 \ u0600——地球,随便\ u06FF u0660——\ u0669 \ u06F0——\ u06F9 _. -铝+)美元/
这将支持波斯语。
保存这个常数
const letters = /^[a-zA-Z0-9]+$/
现在,为了检查部件,使用.match()
const string = 'Hey there...' // get string from a keyup listner
let id = ''
// iterate through each letters
for (var i = 0; i < string.length; i++) {
if (string[i].match(letters) ) {
id += string[i]
} else {
// In case you want to replace with something else
id += '-'
}
}
return id