2015-10-06 151 views
0

这可能是挑剔的,但我想知道使用正则表达式时最有效的工作流程是什么;我应该只使用testexecexec吗?正则表达式 - 测试或匹配

例如:我有一个正则表达式,用于删除最后一个字符(\w)后的所有非字(\W)。

E.g.

var str = 'Example string with _some weird formatting at the end *_&^', 
    reg = /(.*\w)/; 

更重要的是有效的:

if (reg.test(str)) { 
    str = reg.exec(str)[0]; 
} 

var res = reg.exec(str); 
str = (res && res[0]) || str; 

此外,有没有办法既可以导致异常被抛出?

+2

最有效的是不使用'test'或'exec',而是使用'replace'目录ectly。 –

回答

2

底线:与大多数方法相比,正则表达式很昂贵。

reg.test()reg.exec()将分别运行针对目标str表达,所以这将是比刚刚运行reg.exec()更加昂贵。


但是,如果你想更换数据,你可以使用str.replace()

str = str.replace(/\W+$/, ''); 

这不仅是速度快(只需评价一个表达式),但也务实。没有比实用的解决方案好多了!


注:如有疑问,test

+0

有没有什么时候我会使用'RegExp.exec'而不是'String.replace'? 'RegExp.exec'在使用'global'标志时会做一些有趣的“事情”(我还没有完全弄清楚)。 – keldar

+1

@keldar ...如果你想替换文本,使用'String.replace()'。如果你想搜索一个字符串,使用'RegExp.exec()'。如果你只需要一个'true' /'false'返回值,可以使用'RegExp.test()'或'String.search()'。 *(转自[MDN文档](https://developer.mozilla。org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec))* – Sam

1

您可以使用名为jsperf.com的非常有用的站点来比较不同的测试用例性能。

您可以检查的基准比较的两个代码之间的位置:

test with exec VS exec-only

这是结果:

enter image description here

enter image description here

+0

同样 - 不知道为什么,但看不出什么明显的。 – keldar

+0

@keldar你的问题是相当有效的,但是你可能对什么是歪曲的有了一个想法,但你可以看到一个基准结果,报告,度量和数字,以准确理解你有什么想法。希望基准对你的洞察力有所帮助 –

+0

对不起 - 有人删除了他们的评论,说“代码在jsPerf上产生错误”,我回复说“同样 - ”,我收到错误信息,“看不到任何明显的东西” ,在设置中没有明显的错误。你的jsPerf非常有帮助! – keldar