将正则表达式标记为要编译的表达式后,幕后发生了什么?这与缓存的正则表达式相比如何?
使用此信息,您如何确定与性能提升相比,计算成本何时可忽略不计?
有许多类似的问题,但显然没有完美的匹配,这就是我要问的原因.
我想分裂一个随机字符串(如123xx456yy789通过字符串分隔符的列表)(例如xx,yy),并包括在结果中的分隔符(在这里:123,xx,456,yy,789).
良好的表现是一个很好的奖金.如果可能的话,应该避免使用正则表达式.
更新:我做了一些性能检查并比较了结果(虽然懒得正式检查).测试的解决方案是(随机顺序):
其他解决方案未经过测试,因为它们与其他解决方案类似,或者来得太晚.
这是测试代码:
class Program
{
private static readonly List<Func<string, List<string>, List<string>>> Functions;
private static readonly List<string> Sources;
private static readonly List<List<string>> Delimiters;
static Program ()
{
Functions = new List<Func<string, List<string>, List<string>>> ();
Functions.Add ((s, l) => s.SplitIncludeDelimiters_Gabe (l).ToList ());
Functions.Add ((s, l) => s.SplitIncludeDelimiters_Guffa (l).ToList ());
Functions.Add ((s, l) => s.SplitIncludeDelimiters_Naive (l).ToList ());
Functions.Add …Run Code Online (Sandbox Code Playgroud) 每次我必须对字符串进行简单的包含或替换操作时,我正在搜索的术语是固定值,我发现如果我采用我的示例输入并对其进行一些分析,则使用编译的正则表达式是几乎*总是比使用String类中的等效方法更快.
我试过比较各种方法(hs是搜索的"草堆",搜索ndl的"针",repl是替换值.regex总是用RegexOptions.Compiled选项创建):
hs.Replace( ndl, repl ) VS regex.Replace( hs, repl )hs.Contains( ndl ) VS regex.IsMatch( hs )我发现相当多的讨论集中于这两种技术都更快(1,2,3,和其他的负载),但是这些讨论似乎总是集中在:
我不明白这是怎么回事:正则表达式引擎如何比同等字符串版本更快地比较任何两个字符串的子串匹配?这似乎适用于非常小或非常大的搜索空间,或搜索条件的小或大,或者搜索项是在搜索空间的早期还是晚期发生的.
那么,为什么正则表达式会更快?
*事实上,我唯一能够证明字符串版本比编译正则表达式更快的情况是搜索空字符串时!从单个字符串到非常长的字符串的任何其他情况都由编译的正则表达式比等效的字符串方法更快地处理.
更新:添加了一个条款,以澄清我正在查看在编译时已知搜索项的情况.对于动态或一次性操作,编译正则表达式的开销倾向于使结果倾斜以支持字符串方法.
我有一个字符串1ADFGRE#34GGGHT#04RTYHGR.
我想通过消除从中提取单词#.
喜欢:
a = 1ADFGRE
b = 34GGGHT
c = 04RTYHGR
Run Code Online (Sandbox Code Playgroud) 您好,您可以建议一个简短的方法,如何用分号分隔用户输入,并将其存储到数组中.
用户输入单词时的行应该如下所示......
First;Second;Third;Forth
Run Code Online (Sandbox Code Playgroud)