首页 > 解决方案 > 正则表达式验证器字母数字允许空字段但不仅限于空格

问题描述

我正在尝试编写一个允许

只有字母数字

这似乎有效,只是想知道我们是否可以使它更清洁。

/^$|(?!\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();
  });

标签: javaregex

解决方案


您可以使用量词,*这意味着零次或多次出现

此外,您可以使用 \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

推荐阅读