Hay varias variantes de las cuerdas:
"txt files `(*.txt)|*.txt|All files (*.*)|*.*`""Image Files`|*.jpg;*.jpeg;*.png;`""Excel Files `(*.xls, *.xlsx)|*.xls;*.xlsx|CSV Files (*.csv)|*.csv`" La subcadena puede terminar con cualquier carácter (space, ',', '.', '|', ';') - no importa.
Probé las siguientes opciones: " [^*].{3,4}(.?);", "[^*]+.(.?); ".
Necesito una expresión regular para obtener string[] = {.jpg, .jpeg, ...} , preferiblemente sin elementos duplicados.
¿ Realmente necesitas una expresión regular?
En primer lugar, si se divide por | , cada entrada impar en el resultado es una lista de extensiones. Luego puede dividir eso nuevamente por ; para obtener las extensiones, que luego puede aplanar en una sola secuencia y recortar cada elemento del * inicial. Finalmente, obtenga el conjunto distinto de eso y póngalo en una matriz.
Todo esto se puede lograr con Split y Linq:
var extensions = filter.Split('|', StringSplitOptions.RemoveEmptyEntries) .Where((x, i) => i % 2 != 0) .SelectMany(x => x.Split(';', StringSplitOptions.RemoveEmptyEntries)) .Select(x => x.TrimStart('*')) .Distinct() .ToArray();Eliminar las entradas vacías de la división garantiza que, si termina con un separador, se ignore.
Véalo en acción en .NET Fiddle .
Sus cadenas de ejemplo parecen consistir en una parte inicial opcional entre paréntesis seguida de una tubería | y luego las extensiones.
Si desea hacer coincidir el formato de los datos, puede usar un grupo de captura con el mismo nombre y la propiedad Group.Captures .
\b[fF]iles\b[^*()]*(?:\([^()]*\))?\|\*(?<ext>\.[\w*]+)(?:[,;]\*(?<ext>\.[\w*]+))*En partes, el patrón coincide:
\b[fF]iles\b Coincide con archivos o Archivos[^*()]* Opcionalmente coincide con cualquier carácter excepto * ( )(?:\([^()]*\))? Opcionalmente, haga coincidir una parte entre paréntesis\|\* Partido |*(?<ext>\.[\w*]+) Grupo con nombre ext , match . y 1+ veces una palabra char o *(?: grupo de no captura[,;]\* Coincide con , o ; seguido de *(?<ext>\.[\w*]+) Mismo patrón para grupo ext)* Cierre el grupo de no captura y, opcionalmente, repítalo para obtener todas las extensionesVea una demostración de C# regex 101 y una demostración de C# .
Por ejemplo
string pattern = @"\b[fF]iles\b[^*()]*(?:\([^()]*\))?\|\*(?<ext>\.[\w*]+)(?:[,;]\*(?<ext>\.[\w*]+))*"; string input = @"txt files `(*.txt)|*.txt|All files (*.*)|*.*` Image Files`|*.jpg;*.jpeg;*.png;` Excel Files `(*.xls, *.xlsx)|*.xls;*.xlsx|CSV Files (*.csv)|*.csv`"; var strings = Regex.Matches(input, pattern) .SelectMany(m => m.Groups["ext"].Captures.Select(c => c.Value)) .ToArray() .Distinct(); foreach (var s in strings) { Console.WriteLine(s); }Producción
.txt .* .jpg .jpeg .png .xls .xlsx .csvOtro patrón más corto no relacionado con el formato de los datos, emparejando un punto y 3 o 4 caracteres de palabra o un asterisco y afirmando un punto a la izquierda:
(?<=\*)\.(?:\w{3,4}\b|\*)Vea otra demostración de expresiones regulares .