这种模式有什么问题?

What's wrong with this pattern?

谁能告诉我这个正则表达式有什么问题

"^[a-zA-Z0-9 -\/_&()']*$"

我希望它只接受像 abc123/-_ 这样的值,但我不确定为什么它甚至接受 ABC

但它不接受双引号。

这是我的代码:

public static final Pattern 

    PATTREN = Pattern.compile("^[a-zA-Z0-9 -\/_&()']*$");
    Matcher m = PATTREN .matcher("ABC\"");
    return m.matches();

模式是 A-Z,那么您认为它为什么不允许大写字符?

您正在使用 [] 定义字符 class;方括号之间的任何内容都被视为 "valid" 字符。因此,如果您不需要大写字母,请从 [].

中删除 A-Z

顺便说一句:虽然它不支持 Java,但您可能想玩 https://regex101.com/

这是一个很好的 "practice" 正则表达式站点; "convert" 从其他语言到 Java 的正则表达式并不难。

我相信这就是你想要的

  • 唯一需要在 [] 中转义的字符是连字符 - 它具有特殊含义。其他一切都是字面意思,甚至括号、斜杠等通常都有意义。

  • 不需要开始和结束标记

  • 您可以在模式中使用 Pattern.CASE_INSENSITIVE 标志,而不是通过 A-Za-z 增加额外的复杂性 代码

例子

Pattern pattern = Pattern.compile("[a-z0-9\-/_&()']*", Pattern.CASE_INSENSITIVE);
System.out.println(pattern.matcher("abc123/-_'s").matches());
System.out.println(pattern.matcher("ABC\"").matches());