匹配括号之间的整数

我得到了以下格式的一串字符串:

ASDF [ 6] ZXC[1] OtPasd[ 4 ] asdffa[ 7] 

我需要检索有效字符串括号之间的整数。 字符串有效,只要:

  1. 括号之间仅存在空格。 IE:“ZXCV [a2]”无效
  2. 所有支架都已正确关闭。 IE:“qwr [2”无效
  3. 所有琴弦只有一个开/关括号。 IE:“zxcf [4]]]”无效

我最好避免使用正则表达式,因为我得到了大量的字符串,所以计算上不密集的东西会更好。

validation和检索整数的最简洁, 最快捷的方法是什么?

编辑:我决定使用正则表达式。

在我个人看来,最干净的解决方案是使用正则表达式。 但不是猜测它是否是计算密集型的,我宁愿对其进行基准测试。 这是代码。

 const int Count = 10000000; const string testString = ""; // 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 

正如您所看到的,不仅正则表达式解决方案更短更清洁,它实际上更快。 如果您使用不同的输入字符串,您会注意到输入字符串越长,第一个和第二个解决方案之间的差距就越大。

试试这个正则表达式:

 \[\s*(\d+)\s*\]$ 

使用这个正则表达式(?m)(?!<=\[)(\[\s*)(\d+)(\s*\])(?!\])你的匹配组中的整数

如果你想避免使用Regex …会使用IndexOf / LastIndexOf然后解析剩余的字符串是否适合你需要的?

要在括号之间获取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;