2011-12-20 28 views
5

Digamos que tengo una cadena:Powershell Regex - grupo denominado opcional coincide

$string1 = "Hello_World:How, are, you:-all -is -well" 

me gustaría usar una expresión regular para que coincida con las secciones de la cadena separados por dos puntos en grupos de nombre. Por ejemplo:

$pattern = "(?<first>.*)\:(?<second>.*)\:(?<third>.*)" 

Este modelo coincidirá con $ $ cadena1 con éxito y que terminaría con los siguientes partidos:

first=Hello_World 
second=How, are, you 
third=-all -is -well 

Esto es bueno, pero hay un problema. El $ cadena1 potencialmente podría faltar la tercera sección, por ejemplo:

$string1 = "Hello_World:How, are, you" 

Por desgracia, esta $ cadena1 ya no coincide con el patrón de expresión. ¿Cómo lo hago para que el patrón coincida con ambos formatos de cadena? (es decir, siempre debería tener una coincidencia "primera" y "segunda", y solo una "tercera" coincidencia si se proporciona).

Respuesta

5

Utilice el cuantificador ? y un grupo que no captura. ¡Además, no use .*!

(?<first>[^:]*):(?<second>[^:]*)(?::(?<third>.*))? 

Además, debe anclar su expresión regular al menos al principio.

2

@ respuesta de FGE debería funcionar, pero si esto es todo lo que está haciendo, yo recomiendo que utilice String.split para conseguir lo que necesita:

$split = $string1.split(':') 
if(($split.count -eq 2) -or ($split.count -eq 3)){ 
    #use $split[0] etc. 
} 
+0

Sí, eso es más sencillo. Sin embargo, dudo en darle el +1 siempre y cuando el OP confirme que las diferentes partes _do no_ contienen ':' - no es que mi solución maneje esto correctamente tampoco, heh. – fge

Cuestiones relacionadas