正则表达式在独立但不在Web应用程序中工作

时间:2015-02-09 11:42:33

标签: java regex

嗨我有一个正则表达式,如果我作为一个独立的java应用程序运行并返回true,它正常工作:

public class Example {

    private static final String VALID_ADVISOR_NAME_FORMAT = 
            "[a-zA-Z" + " " + "-" + "'" + "&" + "(" + ")" + "]";

    public static void main(String[] args) {
        System.out.println(isInvalidAdvisorName("%%%%%"));
    }

    public static boolean isInvalidAdvisorName(String name) {
        return !name.matches(VALID_ADVISOR_NAME_FORMAT);
    }
}

但是如果我在我的Web应用程序中使用相同的方法(在Tomcat中运行),则输出为false。谁能告诉我为什么"%%%"在独立应用程序中被视为无效,但在tomcat中运行的Web应用程序中有效?

1 个答案:

答案 0 :(得分:1)

-表示Unicode table中的字符范围。就像a-z代表az之间的所有字符一样,[ -']之类的正则表达式(您通过" " + "-" + "'"创建它)代表space之间的所有字符{1}}和'

现在让我们看一下Unicode table中某些字符的索引:

  • 空间索引为32
  • '的索引为39
  • %的索引为37

所以%位于space'之间,因此正则表达式[ -']接受它作为有效字符。

要在-[ ]文字,您需要

  • 使用\-(写为字符串"\\-"
  • 将其转义
  • 或将其放置在无法作为范围指示器处理的地方,例如:
    • 在字符类[-foo]
    • 的开头
    • 在角色等级[bar-]
    • 的末尾
    • 在已经创建的范围[a-z-1]之后a-z代表范围,-放在它们之后(1)将被视为文字。

所以你可以尝试这种模式(并删除连接部分,它实际上使你的正则表达式更难阅读和发现错误)。

VALID_ADVISOR_NAME_FORMAT =  "[a-zA-Z \\-'&()]";

此外,如果您希望您的模式接受所描述范围内的多个字符,请在字符类(+表示一个或多个量化)之后添加+

VALID_ADVISOR_NAME_FORMAT =  "[a-zA-Z \\-'&()]+";