簡體   English   中英

java 正則表達式匹配器是有狀態的嗎?

[英]Is java regex matcher stateful?

我來自 python 方面,對 java 正則表達式了解不多,這個問題很容易解釋,讓我添加一些場景。

假設我有一個帶有Matcher matcher變量和 function 的實例,如下所示:

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

在命名所有正則表達式捕獲組的位置,多次調用它會導致問題嗎?

  1. 是的Matcher是有狀態的。

  2. 如果在您(仍在)查看上一次呼叫中的組(等)時findmatch任何1個呼叫,那么您將丟失上一次呼叫中的 state。 這同樣適用於resetreset(CharSequence)以及其他一些方法。 這種行為是 API 設計中固有的,並且有明確的記錄。

  3. Matcher不是線程安全的。 javadoc明確說明了這一點:

    “這個 class 的實例對於多個並發線程使用是不安全的。”

  4. 但是,像您的代碼一樣使用它應該可以工作……前提Matcher僅對當前線程可見/由當前線程使用,並且不能在調用堆棧的上方(或下方)進一步使用。

也可以看看:


相比之下, Pattern既是線程安全的又是不可變/無狀態的。


1 - 這可能是另一個線程,或者是在調用堆棧的不同點使用相同Matcher的當前線程; 即通過遞歸或類似的東西。

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

Matcher維護一些局部變量,如groupVarslocalVarslast等。

groupVars用於記錄捕獲的組,它會在每個Matcher#matchMatcher#find操作之前被重置。

localVars用於記錄匹配操作的上下文。

lastfind使用,它表示上一次find操作的終端偏移量。

如果同時使用Matcher ,這些局部變量將被不同的線程覆蓋,這可能會導致意外結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM