Haciendo coincidir un entero entre los paréntesis

Me dan muchas cuerdas en el siguiente formato:

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

Necesito recuperar el entero entre los paréntesis en las cadenas que son válidas. Las cadenas son válidas siempre que:

  1. Sólo los espacios en blanco están presentes entre los corchetes. IE: “ZXCV [a2]” no es válido
  2. Todos los soportes están correctamente cerrados. IE: “qwr [2” no es válido
  3. Todas las cuerdas tienen un solo soporte de apertura / cierre. IE: “zxcf [4]]]” no es válido

Preferiblemente, me gustaría evitar Regex, ya que obtengo un gran número de cadenas, por lo que sería preferible algo computacionalmente no intensivo.

¿Cuál es la forma más limpia y rápida de validar y recuperar el número entero?

Edit: decidí usar Regex.

En mi opinión personal, la solución más limpia es usar expresiones regulares. Pero en lugar de adivinar si es computacionalmente intensivo, preferiría compararlo. Aquí está el código.

 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); 

Y aquí están los resultados:

 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 

Como puede ver, no solo la solución de expresiones regulares es más corta y limpia, sino que también es más rápida. Y si juega con diferentes cadenas de entrada, notará que cuanto más larga sea la cadena de entrada, mayor será la brecha entre la primera y la segunda solución.

Prueba esta expresión regular:

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

use esta expresión regular (?m)(?!<=\[)(\[\s*)(\d+)(\s*\])(?!\]) su entero en el grupo de coincidencias

Si desea evitar el uso de Regex … ¿Utilizaría IndexOf / LastIndexOf y luego analizar la cadena restante para lo que necesita?

Para obtener el int entre los paréntesis, también puedes intentarlo de esta manera:

 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;