匹配括号之间的整数

时间:2012-09-11 13:25:42

标签: c# .net regex string

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

ASDF [         6]

ZXC[1]

OtPasd[ 4 ]

asdffa[   7]

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

  1. 括号之间只有空格。 I.E:“ZXCV [a2]”无效
  2. 所有括号均已正确关闭。 I.E:“qwr [2”无效
  3. 所有字符串只有一个开/关括号。 I.E:“zxcf [4]]]”无效
  4. 我最好避免使用正则表达式,因为我会获得大量字符串,因此计算上不那么密集的东西会更好。

    验证和检索整数的最干净,最强最快的方法是什么?

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

5 个答案:

答案 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;