Regex - совпадение нескольких суффиксов (длиннее или короче)

В настоящее время я застрял в проблеме с регулярным выражением 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 групп, это означает, что с указанным портом или без него, я хотел бы проанализировать имя сервера и экземпляра, и если порт включен, то и порт тоже.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете поместить квантификатор, который допускает появление 0 после , и последнего числа, например

(\w+)\\(\w+)\,?(\d*)

Ух ты! Спасибо, @Lance Toth. что ? действительно чего не хватает да! Быстрое наблюдение, можно ли удалить пустую / нулевую группу 4, если порт не указан? например [QRMLD1001 \ TEST] по-прежнему дает 4 группы, последняя из которых установлена ​​как пустая.

Carl Ardiente 14.03.2018 11:38

@CarlArdiente, я не знаю, извините

Lance Toth 14.03.2018 11:41

Я мог бы просто сделать всю последнюю часть шаблона необязательной.

(\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]

Carl Ardiente 15.03.2018 01:52

@CarlArdiente Но я думал, что запятая необязательна? Также в первом варианте есть группа без запятой, поэтому вы просто пропустите ее. Посмотрите, какие совпадения вернутся, и вы увидите.

Matt 15.03.2018 04:33

Другие вопросы по теме