[英]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.