ASP.NET:使用应用程序范围的Regex对象是否安全?

ing*_*939 3 regex vb.net asp.net caching thread-safety

我有一个复杂的正则表达式,用于帮助从用户输入中删除HTML.我知道.NET在某种程度上缓存了静态Regex调用,但是这个调用很大并经常使用,所以我希望它可以随意使用.

在一个网站项目中,我想在App_Code的一个帮助器类中将它定义为一个共享对象,例如:

App_Code中的AppHelper.vb:

Public Class AppHelper

  Private Shared _rxRemoveHTML As New Regex("(<[\s\S]*?(style|script)[\s\S]*?>[\s\S]*?</[\s\S]*?(style|script)[\s\S]*?>)|<[^<>]*>|&#[0-9a-z]+;|&#|<|>|\\|`|\t", RegexOptions.IgnoreCase + RegexOptions.Multiline)
Run Code Online (Sandbox Code Playgroud)

这将使应用程序的生命保持活力.

公共职能部门负责:

Public Shared Function RemoveHTML(ByVal sIn As String) As String
  Return _rxRemoveHTML.Replace(sIn, "")
End Function
Run Code Online (Sandbox Code Playgroud)

问题是,这是否是线程安全的,否则对于Web应用程序是否可以?

Ric*_*lly 5

是的,这样做是完全安全的.摘自MSDN:

线程安全

Regex类是不可变的(只读)和线程安全的.可以在任何线程上创建正则表达式对象并在线程之间共享