java - 正则表达式验证器字母数字允许空字段但不仅限于空格
问题描述
我正在尝试编写一个允许
只有字母数字
- az、AZ、连字符、下划线、空格和空字段(无符号!@#$% 等)
- 但是限制仅包含空格的字段,(如果存在字符,则允许在开头、中间和结尾使用空格)
这似乎有效,只是想知道我们是否可以使它更清洁。
/^$|(?!\s+$)[a-zA-Z0-9-_ ]+$/
试图通过这些单元测试:
it('validator should allow alphanumeric characters', () => {
formGroup.get(productName).patchValue('ABCabc1234');
formGroup.updateValueAndValidity();
expect(formGroup.valid).toBeTrue();
});
it('validator should not allow symbols', () => {
formGroup.get(productName).patchValue('ABCabc@#$%1234');
formGroup.updateValueAndValidity();
expect(formGroup.invalid).toBeTrue();
});
it('validator should allow empty field', () => {
formGroup.get(productName).patchValue('');
formGroup.updateValueAndValidity();
expect(formGroup.valid).toBeTrue();
});
it('validator should allow space among words', () => {
formGroup.get(productName).patchValue(' ABC abc1234 xyz ');
formGroup.updateValueAndValidity();
expect(formGroup.valid).toBeTrue();
});
it('validator should not allow all whitespaces', () => {
formGroup.get(productName).patchValue(' ');
formGroup.updateValueAndValidity();
expect(formGroup.invalid).toBeTrue();
});
解决方案
您可以使用量词,*
这意味着零次或多次出现。
此外,您可以使用 \w
.[A-Za-z0-9_]
最终的正则表达式可以在(?!\s+$)[\s\w-]*
其中为行尾的一个或多个空白字符(?!\s+$)
指定Negative Lookahead 。
public class Main {
public static void main(String[] args) {
// Test strings
String[] arr = { "ABCabc1234", "ABCabc@#$%1234", "", " ABC abc1234 xyz ", " " };
for (String s : arr) {
System.out.println(s + " => " + s.matches("(?!\\s+$)[\\s\\w-]*"));
}
}
}
输出:
ABCabc1234 => true
ABCabc@#$%1234 => false
=> true
ABC abc1234 xyz => true
=> false
推荐阅读
- java - 在 spring-boot 控制器中标记为 final 的服务实例的问题?
- c++ - 当我使用 cin 输入错误的变量类型时会发生什么?
- laravel - 如何更新 laravel eloquent where 子句?
- tws - reqAllOpenOrders() 无法下载我帐户的数据
- powershell-2.0 - 执行后删除文件夹和脚本
- azure - Azure Log Analytics 未收集日志
- python - Django:具有通用视图的 reverse_lazy()
- android - 安卓短信验证API
- c# - 在 C# 中屏蔽字节数组
- r - 使用 R CMD 检查时避免检查“\notrun”示例