В настоящее время я застрял в проблеме с регулярным выражением powershell, так как я не могу получить желаемый результат имени сервера, имени экземпляра и порта, если он доступен. По общему признанию, мне нужно многое понять, так как я новичок в регулярных выражениях.
Вот моя установка и мои выводы
Data:
ZP000042
QRMLD1001\TEST
oFJA
UUQE0294\FAR,8594
В основном мне нужно извлечь следующие предметы:
Match 1[QRMLD1001\TEST] - Servername: QRMLD1001 ; Instancename: TEST
Match 2[UUQE0294\FAR,8594] - Servername: UUQE0294 ; Instancename: FAR ; Port: 8594
Пока я могу извлечь Match 2[ UUQE0294\FAR,859] только через это регулярное выражение.
(\w+)\\(\w+)\,(\d+)
Результат:
Groups : {0, 1, 2, 3}
Success : True
Name : 0
Captures : {0}
Index : 0
Length : 16
Value : UUQE0294\FAR,859
Success : True
Name : 1
Captures : {1}
Index : 0
Length : 8
Value : UUQE0294
Success : True
Name : 2
Captures : {2}
Index : 9
Length : 3
Value : FAR
Success : True
Name : 3
Captures : {3}
Index : 13
Length : 3
Value : 859
Я действительно просто хочу иметь от 3 до 4 групп, это означает, что с указанным портом или без него, я хотел бы проанализировать имя сервера и экземпляра, и если порт включен, то и порт тоже.


Вы можете поместить квантификатор, который допускает появление 0 после , и последнего числа, например
(\w+)\\(\w+)\,?(\d*)
@CarlArdiente, я не знаю, извините
Я мог бы просто сделать всю последнюю часть шаблона необязательной.
(\w+)\\(\w+)(,(\d+))?
Так что это соответствовало бы обоим этим
UUQE0294\FAR,8594
UUQE0294\FAR
Вы могли бы сделать это немного более надежным, немного заглянув назад, но здесь не так много пользы. Просто обратите внимание, что ваши группы совпадений нужно будет скорректировать, так как там есть еще одна. Вы также можете сделать эту часть немного проще, используя именованные совпадения
(?<server>\w+)\\(?<instance>\w+)(,(?<port>\d+))?
Так что теперь вы можете делать это и не беспокоиться о групповых индексах.
$matches.server
$matches.instance
$matches.port
Если нет соответствия для порта, тогда $matches.port будет просто нулевым.
Большое спасибо, чувак! названные группы и взгляд назад - это что-то новое для меня, так что спасибо, что указали на это! Я немного изменил ваше Regex на (?<server>\w+)\\(?<instance>\w+)\,(?<port>\d+)?, так как исходный, который вы опубликовали, фактически дает мне другую группу с запятой [например, , 8594]
@CarlArdiente Но я думал, что запятая необязательна? Также в первом варианте есть группа без запятой, поэтому вы просто пропустите ее. Посмотрите, какие совпадения вернутся, и вы увидите.
Ух ты! Спасибо, @Lance Toth. что ? действительно чего не хватает да! Быстрое наблюдение, можно ли удалить пустую / нулевую группу 4, если порт не указан? например [QRMLD1001 \ TEST] по-прежнему дает 4 группы, последняя из которых установлена как пустая.