Вот версия, которая учитывает запрещенные первые цифры:
^(?:((?!\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
Спасибо. Теперь я могу делать смешанное программирование в глаголице и иероглипике. ;) –
Вы не можете просто использовать @ "\ w +" для соответствия идентификатору - он будет включать слова, начинающиеся с цифр - например. он будет соответствовать «12abc», который является недопустимым идентификатором. Я предлагаю @ "[\ w- [0-9]] \ w *" как решение этого. –
-1 потому что ответ неправильный. –