这种模式有什么问题?

时间:2015-03-09 07:35:24

标签: java regex pattern-matching

任何人都可以告诉我这个正则表达式的错误

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

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

但是它不接受双引号。

这是我的代码:

public static final Pattern 

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

2 个答案:

答案 0 :(得分:0)

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

您正在使用[]定义一个字符类;方括号之间的任何东西都被视为“有效”字符。因此,如果您不想要大写字母,请从[]中删除A-Z。

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

这是一个“练习”正则表达式的好网站;并且很难将正则表达式从其他语言“转换”为Java。

答案 1 :(得分:0)

我相信这就是你想要的

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

  • 无需开始和结束标记

  • 您可以在模式中使用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());