分享
三行代码  ›  专栏  ›  技术社区  ›  Rocky Li

JavaReX匹配器有状态吗?

  •  0
  • Rocky Li  · 技术社区  · 1 月前

    我来自python方面,对java regex了解不多,这个问题很简单,让我添加一些场景。

    假设我有一个 Matcher matcher 变量和类似这样的函数:

    public String getMatch(String group) {
        if (matcher.find()) {
            return matcher.group(group);
        } else { blah }
    }
    

    在所有regex捕获组都命名的地方,多次调用会导致问题吗?

    2 回复  |  直到 1 月前
        1
  •  2
  •   Stephen C    1 月前
    1. 是的 Matcher 是有状态的。

    2. 如果 任何东西 电话 find match 当您(仍然)查看上一个调用中的组(etc)时,您将丢失上一个调用中的状态。同样适用于 reset reset(CharSequence) ,以及其他一些方法。这种行为是api设计中固有的,并且有清楚的文档记录。

    3. 匹配器 不是线程安全的。这个 javadoc 明确声明:

      “此类的实例对于多个并发线程使用是不安全的。”

    4. 但是,像使用代码一样使用它应该是可行的… 假如 匹配器 只对当前线程可见/由当前线程使用,而不在调用堆栈的上(或下)位置使用。

    参见:


    相比之下, Pattern 是线程安全和不可变/无状态的。


    1-可能是另一个线程,或者当前正在使用相同的线程 匹配器 在调用堆栈的不同点;即通过递归或类似的方法。

        2
  •  1
  •   sulin    1 月前

    Pattern 是线程安全的,但是 Matcher 不是。

    匹配器 维护一些局部变量,如 groupVars , localVars , last 等。

    集团公司 用于记录捕获的组,它将在每个 Matcher#match Matcher#find 操作。

    局部变量 用于记录匹配操作的上下文。

    最后的 被使用 find ,它表示上一个 找到 操作。

    如果你使用 匹配器 同时,这些局部变量将被不同的线程覆盖,这可能会导致意外的结果。