2010-12-09 14 views
5

Welcher Art ist die richtige Zuordnung eines C# -Kennzeichens, insbesondere eines Eigenschafts- oder Feldnamens, mit .Net Regex-Mustern?Übereinstimmung C# Unicode-ID mit Regex

Hintergrund. Früher habe ich das ASCII-zentrische @ "[_ a-zA-Z] [_a-zA-Z0-9] *" verwendet. "Aber Unicode-Groß- und Kleinbuchstaben sind jetzt echt, z. "Aboö". Wie sollte ich diese in das Muster aufnehmen?

Danke, Max

Antwort

1

Ist das Problem durch die vordefinierten Klassen in regex gelöst \ w passt übereinö.

+1

Danke. Jetzt kann ich gemischte Programmierung in Glagolitic und Hieroglyphs machen. ;) –

+1

Sie können nicht einfach @ "\ w +" verwenden, um einen Bezeichner zu finden - es würde Wörter enthalten, die mit Zahlen beginnen - z. es würde auf "12abc" passen, was eine ungültige Kennung ist. Ich schlage @ "[\ w- [0-9]] \ w *" als Lösung vor. –

+0

-1 weil die Antwort falsch ist. –

5

Nach http://msdn.microsoft.com/en-us/library/aa664670.aspx, und ignorieren die Schlüsselwort und Unicode-Escape-Sequenz stuff,

@?[_\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

Ich denke, man kann '\ p vereinfachen {Lu} \ p {Ll} \ p {Lt} \ p {Lm} \ p {Lo} 'nur zu' \ p {L} '. Gleiches gilt für einige der anderen hier verwendeten Klassen. Ich denke, wenn Microsoft das in ihre Standards aufgenommen hat, könnte es am einfachsten sein, dasselbe zu tun. – Rich

7

Hier ist eine Version, die die nicht anerkannten führenden Ziffern berücksichtigt:

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

Und hier sind einige Tests in 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

Ermöglicht dies einen führenden Unterstrich? –

+1

@ rory.ap Es tut. (erlaube einen führenden Unterstrich) –

Verwandte Themen