这是一个两部分问题.假设你有一个字符串数组,可以在一个字符处拆分(例如’@’的电子邮件地址或’.’的文件名),这是在拆分字符之前找到字符的最高效方式?
my_string.split(char)[0]
要么
my_string[/regex/]
问题的第二部分是你如何编写一个正则表达式来获取角色的第一个实例之前的所有内容.下面的正则表达式在’.’之前找到某些字符. (因为’.’不在模式中)但这是我找到解决方案的hacky方法.
my_string[/[A-Za-z0-9\_-]+/]
谢谢!
解决方法
回答第一部分的最简单方法是一如既往地将其与您的实际数据进行对比.例如:
require 'benchmark' Benchmark.bm do |x| x.report { 50000.times { a = 'a@b.c'.split('@')[0] } } x.report { 50000.times { a = 'a@b.c'[/[^@]+/] } } end
说(根据我的设置):
user system total real 0.130000 0.010000 0.140000 ( 0.130946) 0.090000 0.000000 0.090000 ( 0.096260)
因此,正则表达式解决方案看起来要快一点,但即使有50 000次迭代,差异也几乎不可察觉. OTOH,正则表达式解决方案准确地说出你的意思(“在第一个@之前给我一切”),而拆分解决方案以稍微迂回的方式获得你想要的结果.
拆分方法可能更慢,因为它必须扫描整个字符串以将其拆分成碎片,然后构建一个碎片数组,最后提取数组的第一个元素并将其余部分抛弃;我不知道虚拟机是否足够聪明,无法识别它不需要构建阵列,这只是一些快速的猜测工作.
就你的第二个问题而言,说出你的意思:
my_string[/[^.]+/]
如果你想要在第一个时期之前的所有内容然后说“一切直到一个时期”而不是“由这些字符构成的第一个块(碰巧不包含句号)”.