2010-12-09 51 views
5

¿Cuál es la forma correcta de hacer coincidir un identificador de C#, específicamente una propiedad o un nombre de campo, utilizando patrones .Net Regex?Coincide con el identificador Unicode de C# con Regex

Fondo. Solía ​​usar el ASCII céntrico @ "[_ a-zA-Z] [_ a-zA-Z0-9] *" Pero ahora los caracteres en mayúsculas y minúsculas Unicode son legítimos, p. "AboöДЖem". ¿Cómo debería incluir estos en el patrón?

Gracias, Max

Respuesta

1

Es que problema resuelto por las clases predefinidas en la expresión regular \ w coincidirá con öД.

+1

Gracias. Ahora puedo hacer una programación mixta en Glagolitic y Hieroglypics. ;) –

+1

No se puede simplemente usar @ "\ w +" para que coincida con un identificador; esto incluiría palabras que comiencen con números, p. Ej. coincidiría en "12abc", que es un identificador no válido. Propongo @ "[\ w- [0-9]] \ w *" como una solución a eso. –

+0

-1 porque la respuesta es incorrecta. –

5

Según http://msdn.microsoft.com/en-us/library/aa664670.aspx, e ignorando el palabra clave y Unicode-escape-sequence cosas,

@?[_\p{Lu}\p{Ll}\p{Lt}\p{Lm}\p{Lo}\p{Nl}][\p{Lu}\p{Ll}\p{Lt}\p{Lm}\p{Lo}\p{Nl}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\p{Cf}]* 
+0

Creo que se puede simplificar '\ p {Lu} \ p {Ll} \ p {Lt} \ p {Lm} \ p {Lo} 'para simplemente' \ p {L} '. Lo mismo para algunas de las otras clases de char usadas aquí. Supongo que si eso es lo que Microsoft ha puesto en sus estándares, podría ser lo más simple hacer lo mismo. – Rich

7

Aquí hay una versión que tenga en cuenta los dígitos iniciales no permitidos:

^(?:((?!\d)\w+(?:\.(?!\d)\w+)*)\.)?((?!\d)\w+)$ 

y aquí están algunas pruebas en PowerShell:

[regex]$regex = '(?x: 
    ^      # Start of string 
    (?: 
     (     # Namespace 
      (?!\d)\w+  # Top-level namespace 
      (?:\.(?!\d)\w+)* # Subsequent namespaces 
     ) 
     \.     # End of namespaces period 
    )?      # Namespace is optional 
    ((?!\d)\w+)    # Class name 
    $      # End of string 
)' 
@(
    'System.Data.Doohickey' 
    '_1System.Data.Doohickey' 
    'System.String' 
    'System.Data.SqlClient.SqlConnection' 
    'DoohickeyClass' 
    'Stackoverflow.Q4400348.AboöДЖem' 
    '1System.Data.Doohickey' # numbers not allowed at start of namespace 
    'System.Data.1Doohickey' # numbers not allowed at start of class 
    'global::DoohickeyClass' # "global::" not part of actual namespace 
) | %{ 
    ($isMatch, $namespace, $class) = ($false, $null, $null) 
    if ($_ -match $regex) { 
     ($isMatch, $namespace, $class) = ($true, $Matches[1], $Matches[2]) 
    } 
    new-object PSObject -prop @{ 
     'IsMatch' = $isMatch 
     'Name'  = $_ 
     'Namespace' = $namespace 
     'Class'  = $class 
    } 
} | ft IsMatch, Name, Namespace, Class -auto 
+0

¿Esto permite un guion bajo? –

+1

@ rory.ap Lo hace. (permite un guion bajo) –

Cuestiones relacionadas