2010-12-09 2 views
5

Каков правильный способ сопоставления идентификатора C#, в частности свойства или имени поля, с использованием шаблонов .Net Regex?Соответствует идентификатору Unicode C# с использованием Regex

Фон. Раньше я использовал ASCII-центр @ "[_ a-zA-Z] [_ a-zA-Z0-9] *" Но теперь символы юникода в верхнем и нижнем регистре являются допустимыми, например. "AboöДЖem". Как включить их в шаблон?

Спасибо, Max

ответ

1

Является ли эта проблема решается с помощью предопределенных классов в регулярном выражении \ w будет соответствовать öД.

+1

Спасибо. Теперь я могу делать смешанное программирование в глаголице и иероглипике. ;) –

+1

Вы не можете просто использовать @ "\ w +" для соответствия идентификатору - он будет включать слова, начинающиеся с цифр - например. он будет соответствовать «12abc», который является недопустимым идентификатором. Я предлагаю @ "[\ w- [0-9]] \ w *" как решение этого. –

+0

-1 потому что ответ неправильный. –

5

Согласно http://msdn.microsoft.com/en-us/library/aa664670.aspx, и игнорируя ключевое слова и юникода-спусковые последовательности материала,

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

Я думаю, вы можете упростить '\ р {Lu} \ р {Ll} \ p {Lt} \ p {Lm} \ p {Lo} 'только для' \ p {L} '. То же самое для некоторых других классов char, используемых здесь. Я полагаю, если это то, что Microsoft установила в своих стандартах, было бы проще сделать то же самое. – Rich

7

Вот версия, которая учитывает запрещенные первые цифры:

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

А вот некоторые тесты в 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

Означает ли это, что это означает подчеркивание? –

+1

@ rory.ap. (разрешить лидирующее подчеркивание) –

Смежные вопросы