使用正则表达式有效地测试"EndsWith"

Now*_*ems 10 c# regex

我需要构建一个Regex(.NET语法)来确定字符串是否以特定值结尾.具体来说,我需要测试一个文件是否具有特定的扩展名(或一组扩展名).

我正在尝试修复的代码使用:

.*\.(png|jpg|gif)$
Run Code Online (Sandbox Code Playgroud)

这在我的场景中失败的比赛非常缓慢(可能是由于回溯.

简单地删除.*(这是因为API仅测试匹配并且不提取任何内容),这使得正则表达式更加高效.

它仍然感觉效率非常低.我错过了一些明显的东西吗?

不幸的是,我没有控制有问题的API所以我需要一个正则表达式才能做到这一点,即使我通常不认为正则表达式是适合这项工作的工具.

我也做了一些测试使用,RegexOptions.RightToLeft并发现我可以从我的测试用例中挤出更多的性能^.*\.(png|jpg|gif)$,但是我找不到RightToLeft在正则表达式字符串中指定选项的方法所以我不认为我可以使用它.

Bli*_*ixt 14

我没有访问C#所以我不能尝试这个...但你应该能够通过强制引擎首先找到字符串的结尾然后匹配扩展来避免太多的回溯:

$(?<=\.(gif|png|jpg))
Run Code Online (Sandbox Code Playgroud)

不过,我不确定后视对性能的影响.

  • 我注意到有人低估了我的答案,但并不在意解释原因......这种做法使得downvote毫无意义,不是吗?请始终解释为什么你要投票. (8认同)

Dyn*_*ard 6

真的,您也可以完全放弃Regex,并使用String.EndsWidth以下内容:

var extensions = new String[] { ".png", ".jpg", ".gif" };
extensions.Any(ext => "something".EndsWith(ext));
Run Code Online (Sandbox Code Playgroud)

我通常觉得在这样的情况下使用简单的字符串函数会更快,而不是试图在运行时和/或开发时间方面找到一种使用高效正则表达式的聪明方法,除非你对知道什么是正则表达式的效率.

  • 在另一个,也许是过于偏见,注意,我认为正则表达式实际上是邪恶的妖精试图超越你的大脑. (6认同)