我得到了一堆以下格式的字符串:
ASDF [ 6]
ZXC[1]
OtPasd[ 4 ]
asdffa[ 7]
我需要检索有效字符串的括号之间的整数。只要满足以下条件,字符串就有效:
- 括号之间仅存在空格。即:“ZXCV[ a2]”无效
- 所有支架均已正确关闭。即:“qwr[2”无效
- 所有字符串都只有一个左/右括号。即:“zxcf[4]]]”无效
我最好避免使用正则表达式,因为我得到了大量的字符串,所以计算不密集的东西会更好。
什么是最干净、最干净的fastest验证和检索整数的方法?
编辑:我决定使用正则表达式。
在我个人看来,最干净的解决方案是使用正则表达式。但与其猜测它是否是计算密集型的,我宁愿对其进行基准测试。这是代码。
const int Count = 10000000;
const string testString = "<whatever>";
// Solution No. 1: use Regex.Match()
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < Count; i++)
{
var match = Regex.Match(@"\[\s*(\d+)\s*\]$", testString);
if (!match.Success)
continue;
var number = int.Parse(match.Groups[1].Value);
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
// Solution No. 2: use IndexOf() and Substring() shenanigans
sw.Start();
for (int i = 0; i < Count; i++)
{
var lb = testString.IndexOf('[');
var rb = testString.LastIndexOf(']');
if (lb < 0 || rb != testString.Length - 1)
continue;
var str = testString.Substring(lb + 1, rb - lb - 1);
int number;
if (!int.TryParse(str, out number))
continue;
// use the number
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
结果如下:
Solution | testString | Time (ms) | Comment
----------|--------------|--------------|-----------------------
1 | abc [ ] | 4476 | Invalid input string
2 | abc [ ] | 6594 | Invalid input string
1 | abc[1234] | 4446 | Valid input string
2 | abc[1234] | 6290 | Valid input string
正如您所看到的,正则表达式解决方案不仅更短、更清晰,而且实际上更快。如果您使用不同的输入字符串,您会发现输入字符串越长,第一个解决方案和第二个解决方案之间的差距就越大。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)