2014-11-06 6 views
1

Я ищу регулярное выражение в C# .net для извлечения принтеров из списка в скрипте.Получить конкретный текст из текстового поля с помощью regexp

Это пример:

@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-М1, MAR-М2) принтеров в массиве Foreach.

Я очень ценю любую помощь в этом, мой разум не работает с Regex.

Спасибо заранее!

ответ

1

Вы могли бы сделать что-то очень простое, как поиск для префикса Print2:

\\\\%Print2%\\(.*) 

Это дает следующий вывод на http://www.regexer.com. Затем вам необходимо получить доступ к первой группе каждого объекта Match, чтобы захватить часть строки, после которой вы находитесь.

enter image description here

Редактировать

Если вы хотите, чтобы инкапсулировать различные номера печати используют следующее, который позволяет 2 для обмена с любым другим номером.

\\\\%Print[0-9]%\\(.*) 
+0

Fantastic! Спасибо огромное! Я забыл сказать, что в том же скрипте может быть, например, @% connect2% \\% Print1% \ SAR-P2,% Print1% - разница. Должен ли я сделать другое выражение для этого или есть способ реализовать его в том же поиске? – Andreas

+1

@ Andreas: Я добавил дополнительный бит в конце, чтобы показать, как вы можете обменивать номер на любой другой номер. – Ian

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

1
foreach (Match match in Regex.Matches(text, 
    @"^@%connect\d+%\s+\\\\%Print2%\\(.*?)\s*$", RegexOptions.IgnoreCase | RegexOptions.Multiline)) 
{ 
    if (match.Success) 
    { 
     var name = match.Groups[1]; 
    } 
}