【问题标题】:Safe to utilize static compiled pattern within doGet() of servlet - matcher.replaceAll()在 servlet 的 doGet() 中安全地使用静态编译模式 - matcher.replaceAll()
【发布时间】:2013-09-23 08:11:36
【问题描述】:

有没有省事:

    private static final String LUCENE_ESCAPE_CHARS = "[\\\\+\\-\\!\\(\\)\\:\\^\\]\\{\\}\\~\\*\\?]";
    private static final Pattern LUCENE_PATTERN = Pattern.compile(LUCENE_ESCAPE_CHARS);
    private static final String REPLACEMENT_STRING = "\\\\$0";

并在多线程环境中使用以下内容,例如 servlet 的 doGet()

String escaped = LUCENE_PATTERN.matcher(query).replaceAll(REPLACEMENT_STRING);

我现在主要关心的是增加额外的延迟(例如由于锁定)或出现错误发生的情况。

【问题讨论】:

  • 如果大多数字符在字符类[] 中,则不需要转义。如果定位正确,^-] 等字符可以在 [] 中进行非转义。例如:final String LUCENE_ESCAPE_CHARS = "[]\\\\+!():^{}~*?-]";
  • ] 如果跟在开头[ 之后,则不需要转义。 ^ 如果不在第一个位置,则不需要转义。 - 如果它位于最后一个位置,则不需要转义。
  • @U 你是否特别提到了朗讯?
  • 不,我指的是 java 正则表达式。通常,大多数需要转义的字符在字符类中不需要它。

标签: java multithreading tomcat servlets pattern-matching


【解决方案1】:

是的它是安全的。Pattern 对象是线程安全的Matcher 对象不是。您可以与多个线程共享模式实例。

但不要在线程之间共享Matcher 实例。

Pattern引用JavaDoc

这个类的实例是不可变的,并且可以被多个人安全使用 并发线程。 Matcher 类的实例不安全 这样的用途。

【讨论】:

    猜你喜欢
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 2019-08-10
    • 2018-03-21
    • 1970-01-01
    相关资源
    最近更新 更多