Я ищу регулярное выражение в С#.net для извлечения принтеров из списка в скрипте.
Это пример:
@set nr=2
@if not exist "%userprofile%\Version%nr%.txt" goto reload
@goto koppla
:reload
@echo skrivare>"%userprofile%\Version%nr%.txt"
@del "%userprofile%\zxy-*.txt"
@call skrivare.cmd
@exit
:koppla
@%connect1% \\%Print2%\Lund-M1
@%connect2% \\%Print2%\MAR-M1
@%connect2% \\%Print2%\MAR-M2
Я хотел бы получить имена (Lund-M1, MAR-M1, MAR-M2) принтеров в массиве для foreach.
Я очень ценю любую помощь в этом, мой разум не работает с Regex.
Заранее спасибо!
Вы можете сделать что-то довольно простое, например, поиск префикса Print2:
\\\\%Print2%\\(.*)
Это дает следующий результат на http://www.regexer.com. Затем вам нужно получить доступ к первой группе каждого объекта Match
чтобы захватить часть строки, после которой вы находитесь.
редактировать
Если вы хотите инкапсулировать разные номера печати, используйте следующее, которое позволяет обменять 2 на любой другой номер.
\\\\%Print[0-9]%\\(.*)
foreach (Match match in Regex.Matches(text,
@"^@%connect\d+%\s+\\\\%Print2%\\(.*?)\s*$", RegexOptions.IgnoreCase | RegexOptions.Multiline))
{
if (match.Success)
{
var name = match.Groups[1];
}
}
(?m:(?<=^@\%connect\d\% \\\\(.*?\\)*)[^\\]+$)
даст три матча по вашему сценарию, со значениями
Lund-M1 MAR-M1 MAR-M2
Так
Regex.Matches(input, @"(?m:(?<=^@\%connect\d\% \\\\(.*?\\)*)[^\\]+$)")
.Cast<Match>()
.Select(m => m.Value)
.ToArray()
дает вам то, что вам нужно.
Это проверяет начало строки @%connect
затем любую цифру, за которой следует %
затем тянет последний сегмент любого пути формы \\something\something\something\AnyNonBackslashChars