我收到了以下格式的字符串:
ASDF [ 6]
ZXC[1]
OtPasd[ 4 ]
asdffa[ 7]
我需要检索有效字符串括号之间的整数。这些字符串只要有效:
我最好避免使用正则表达式,因为我会获得大量字符串,因此计算上不那么密集的东西会更好。
验证和检索整数的最干净,最强最快的方法是什么?
编辑:我决定使用正则表达式。
答案 0 :(得分:1)
在我个人看来,最干净的解决方案是使用正则表达式。但不是猜测它是否是计算密集型的,我宁愿对它进行基准测试。这是代码。
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
正如您所看到的,不仅正则表达式解决方案更短更清洁,实际上更快。如果您使用不同的输入字符串,您会注意到输入字符串越长,第一个和第二个解决方案之间的差距就越大。
答案 1 :(得分:0)
试试这个正则表达式:
\[\s*(\d+)\s*\]$
答案 2 :(得分:0)
使用此正则表达式(?m)(?!<=\[)(\[\s*)(\d+)(\s*\])(?!\])
匹配组中的整数
答案 3 :(得分:0)
如果你想避免使用Regex ...会使用IndexOf / LastIndexOf然后解析剩下的字符串是否适合你需要的东西?
答案 4 :(得分:0)
要在括号之间获取int,您也可以尝试这种方式:
string tmpString = "ASDF [ 6]";
int start = tmpString.IndexOf('[') + 1;
int length = tmpString.IndexOf(']') - start;
string subString = tmpString.Substring(start, length);
int tempInt;
if(Int.TryParse(subString, out tempInt))
return tempInt;