- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
背景:我遇到的一个应用程序使用 TRegEx
来自多个线程的单例。单例初始化为 TRegEx.Create(Pattern, [roCompiled])
在类构造函数中,线程使用它以 RegEx.Match(Value).Groups
开头,并且似乎没有采用同步机制,但是,应用程序运行良好。不过,这只是 TThread.Execute
的一小部分覆盖并且线程上的负载很小。所以这可能总是偶然的,因为线程不太可能在关键部分相互交叉。
想法:一方面,考虑一下,TRegEx
是有道理的。 instance 只会持有一个不可变(编译)模式并直接处理参数输入,或者将此输入保留在(TMatch
)返回值中以供以后可能的延续 - 就像 NextMatch
,例如,在 TMatch
上实现而不是 TRegEx
.和the underlying open source PCRE library seems to be thread-safe .这一切都符合上述情况。另一方面,我认为 TRegEx
实例通常不是线程安全的,例如,在 function TRegEx.Match(const Input: String): TMatch
(如上所述)看起来要与模式匹配的字符串在匹配之前首先存储到实例中。和相同的嵌套 TPerlRegEx
实例在各种功能链中传递并保持事件状态。共享 TRegEx
例如,似乎需要保护实例免受不协调的访问,例如使用关键部分。
也就是说,我怀疑 TRegEx不是线程安全的,但我想请教多线程和判断线程安全的人进行确认。因此,我的问题 - 非常笼统且独立于其演变而来的应用程序:
问题:TRegEx 是线程安全的吗?
最佳答案
构建 Delphi 的正则表达式类的 PCRE 库是线程安全的。见 PCRE pcre_exec thread safe?
但是,Delphi 包装器 TRegex
不是线程安全的。考虑对 pcre_exec
的调用。在 TPerlRegEx.Match
:
OffsetCount := pcre_exec(FPattern, FHints, @FSubject[0], FStop, 0, Opts, @Offsets[0],
High(Offsets));
这里
FSubject
和
Offsets
是
TPerlRegEx
的成员因此将使用
TPerlRegEx
的这个实例在不同线程之间共享,而它又归
TRegEx
的实例所有.
TRegEx
在您希望的意义上是线程安全的(多个线程在共享的编译正则表达式上执行匹配)这些变量需要对匹配函数的每次调用都是私有(private)的。
关于regex - System.RegularExpressions.TRegEx 是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53016707/
我见过几个 TRegEx 使用的 Delphi 示例,例如 Delphi 10.1.2 中的以下示例: try RegexObj := TRegEx.Create(REGEX_EXTRACTEMA
我正在处理 TStringList 中的多个字符串,并且想要跳过一些与特定正则表达式模式不匹配的行。因此我创建了一个 ^(?!\t\w+\t\w+) 的模式并尝试过 program P; uses
如果它们与模式匹配,我想将大字符串中的所有字符@替换为#13#10。 但是如何获取我的“[0-9][0-9][0-9][0-9][0-9][0-9][0-9]”的值要放入我的替换字段的模式? patt
我在使用 TRegEx.replace 时遇到问题: var Value, Pattern, Replace: string; begin Value := 'my_replace_str
我创建了一个使用 Tregex 提取子树的类。我使用了“TregexPattern.java”中的一些代码片段,因为我不想让程序使用控制台命令。 一般来说,有一个句子的树,我想提取某些子树(没有用户交
我有一个小函数,用于在用户取消编辑后验证 StringGrid 中的列。 void validateColumn(int column, const UnicodeString regexp, TSt
背景:我遇到的一个应用程序使用 TRegEx来自多个线程的单例。单例初始化为 TRegEx.Create(Pattern, [roCompiled])在类构造函数中,线程使用它以 RegEx.Matc
我试图弄清楚是否可以使用多个单词的条件有效地提取 NP。这是我当前的代码: public static List getNounPhrasesWithMultipleKeywords(Annotati
我希望在 Delphi XE 中创建一个正则表达式,它将匹配一个数字,后跟一个小数点,后跟(本质上)无限数量的数字。 有效示例: 2.334 150.2 0.23 3 无效示例: 3..42 4-2.
我编写了一个正则表达式,其作用是将所有匹配项返回到其三个备用捕获组。我的目标是了解每场比赛是哪个捕获组产生的。 PCRE 似乎能够产生该信息。但我还无法强制 Delphi XE8 中的 TRegEx
我想根据连词和逗号分割树。例如,当我有 VP 和 VP 或 NP 和 NP 或 VP, VP 或 NP,NP 时,我想分别提取每个 VP 或 NP。我有以下代码: List subtrees = c
我是 NLP 和 Python 的新手。我正在尝试使用 Tregex 工具和 Python 子进程库从 StanfordCoreNLP 的解析树中提取名词短语的子集。特别是,我正在尝试查找并提取与以下
我是一名优秀的程序员,十分优秀!