[英]Is java regex matcher stateful?
我來自 python 方面,對 java 正則表達式了解不多,這個問題很容易解釋,讓我添加一些場景。
假設我有一個帶有Matcher matcher
變量和 function 的實例,如下所示:
public String getMatch(String group) {
if (matcher.find()) {
return matcher.group(group);
} else { blah }
}
在命名所有正則表達式捕獲組的位置,多次調用它會導致問題嗎?
是的Matcher
是有狀態的。
如果在您(仍在)查看上一次呼叫中的組(等)時find
或match
任何1個呼叫,那么您將丟失上一次呼叫中的 state。 這同樣適用於reset
和reset(CharSequence)
以及其他一些方法。 這種行為是 API 設計中固有的,並且有明確的記錄。
Matcher
不是線程安全的。 javadoc明確說明了這一點:
“這個 class 的實例對於多個並發線程使用是不安全的。”
但是,像您的代碼一樣使用它應該可以工作……前提是Matcher
僅對當前線程可見/由當前線程使用,並且不能在調用堆棧的上方(或下方)進一步使用。
也可以看看:
相比之下, Pattern
既是線程安全的又是不可變/無狀態的。
1 - 這可能是另一個線程,或者是在調用堆棧的不同點使用相同Matcher
的當前線程; 即通過遞歸或類似的東西。
Pattern
是線程安全的,但Matcher
不是。
Matcher
維護一些局部變量,如groupVars
、 localVars
、 last
等。
groupVars
用於記錄捕獲的組,它會在每個Matcher#match
和Matcher#find
操作之前被重置。
localVars
用於記錄匹配操作的上下文。
last
由find
使用,它表示上一次find
操作的終端偏移量。
如果同時使用Matcher
,這些局部變量將被不同的線程覆蓋,這可能會導致意外結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.