Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 何时使用正则表达式与内置字符串方法?_Regex_String - Fatal编程技术网

Regex 何时使用正则表达式与内置字符串方法?

Regex 何时使用正则表达式与内置字符串方法?,regex,string,Regex,String,我注意到关于何时使用正则表达式以及何时使用诸如string.Replace()(.NET)之类的内置字符串函数的许多小争论 似乎很多人都建议在处理字符串时始终使用regex(除了显示它们)。这真的是最佳实践还是我的错误印象?当问题仅仅是“从本文中删除这些单词中出现的任何一个”时,使用正则表达式似乎有点过头了 我喜欢输入,这样我就可以改进自己的代码,更好地回答其他人关于字符串操作的问题(有很多问题)。我认为在基于字符串的搜索/替换是可能的情况下,使用正则表达式作为一种全包解决方案是错误的 Rege

我注意到关于何时使用正则表达式以及何时使用诸如string.Replace()(.NET)之类的内置字符串函数的许多小争论

似乎很多人都建议在处理字符串时始终使用regex(除了显示它们)。这真的是最佳实践还是我的错误印象?当问题仅仅是“从本文中删除这些单词中出现的任何一个”时,使用正则表达式似乎有点过头了


我喜欢输入,这样我就可以改进自己的代码,更好地回答其他人关于字符串操作的问题(有很多问题)。

我认为在基于字符串的搜索/替换是可能的情况下,使用正则表达式作为一种全包解决方案是错误的

Regex本质上是一个模式匹配过程,当您想要匹配的字符串类型是可变的或仅符合特定模式时,应该使用它。对于简单的字符串搜索就足够的情况,我总是建议使用
string
类的内置方法

我从未见过任何性能统计数据表明基于正则表达式的查找比字符串索引更快或更高效。此外,正则表达式引擎的执行能力各不相同


似乎这还不够,构建一个性能非常差的正则表达式是非常容易的(例如,使用了大量回溯),因此如果您真的想使用正则表达式匹配优化性能,就需要对正则表达式有深入的了解。另一方面,即使n00b执行基于字符串的搜索或替换也非常简单。

我倾向于认为,如果有一个专用函数以您想要的方式操作字符串作为string类的一部分,它应该非常接近“good”,因为正则表达式是通用的

但是,与任何主观因素一样,如果您关心性能时间,请使用不同的方法

然后再做一次最容易理解的事情,并进行性能监控,以在运行过程中找到真正的瓶颈。

Regex.Replace()比String.Replace()方法要昂贵得多。尽可能使用String.Replace(),必要时使用Regex


看看这个,看看时间差异。

我只是喜欢正则表达式,但是如果有一个简单的xxx->replace(“foo”,“bar”)类型的函数可用,那么在一个简单的螺丝刀就可以使用正则表达式这样的电动工具时,使用它似乎很愚蠢

如果性能是一个问题,那么对于简单的替换,正则表达式可能会非常消耗cpu。(与一系列“更简单”的调用相比,正则表达式通常在复杂的搜索/转换中更有效)


此外,我还经常被“微小”的实现差异所困扰——比如match()内置的python中暗含的“^…$”。当时我在路上无法上网,结果又买了一本卢茨的书,想知道到底发生了什么

显然,对于复杂的搜索/匹配/替换操作,正则表达式是一种可行的方法。对于用另一个单词替换一个单词这样的简单内容,首选常规字符串方法

但在很多情况下,这并不是那么简单。有时,您会遇到这样一种情况:您可以使用标准字符串操作,而正则表达式解决方案更为优雅。即使香草字符串算法的速度快了10倍,也最好问问自己它在特定代码段中是否重要(例如,如果代码不是在循环中执行)

与使用纯字符串操作的更复杂但更快的算法相比,我更喜欢简单正则表达式操作的可读性


只要我的2美分…

当您想要替换子字符串时,内置的字符串替换方法比正则表达式快。 以下是Golang中的基准数字,我尝试替换3个类型的子字符串

基准替换2---236ns/op

基准替换5---249ns/op

基准替换10---871ns/op

基准Regexp 2---3750ns/op

基准Regexp 5---4457ns/op

基准Regexp 10---6020ns/op

如您所见,如果要替换已知的子字符串,则Replace远比Regexp好。
但如果必须匹配未知字符串或模式,则regexp可能会更好。

我也这么认为。似乎每个基于字符串的答案都有5个正则表达式答案。你是说,在StackOverflow上?这可能是因为人们倾向于只问与字符串无关的问题,而自己解决其余的问题。不明显的类型问题通常需要正则表达式解决方案。不过,这不应被视为两种方法利弊的通用表示形式。:-)电动工具很有趣,直到你用指甲枪把你的手钉在墙上。这个问题大约在一周前被问到:@streetpc:谢谢链接。我相信我刚才看到了,我就是找不到。