#c# #regex
#c# #регулярное выражение
Вопрос:
Помогите написать правильное регулярное выражение для такого фрагмента текста.
Здесь необходимо :
- Чтобы сопоставить все эти строки. Но ключевой фигурой является идентификатор 123. Для выхода необходимо указать идентификатор политики 128
- и как поместить каждую строку в группу, потому что мне нужна каждая строка, преобразованная в другой вид
set policy id 128
from "Trust" to "Untrust" "lm pool" "172.16.2.2/32" "ANY" permit
set policy id 128
set dst-address "MIEP"
set dst-address "MIEP WS"
set dst-address "radius1"
set dst-address "radius2"
exit
Как я могу дополнить свое творение:
StreamReader reader = new StreamReader(opendialog.FileName);
string patternPolicy = @"set policy (id)(. )exit";
var matchesPolicy = Regex.Matches(
reader.ReadToEnd(),
patternPolicy,
RegexOptions.Multiline);
Комментарии:
1. Что такое
id 123
? Какой ожидаемый результат здесь? Когда вы говорите «поместите каждую строку в группу», о каких строках вы говорите?2. Существует большой текстовый файл (конфигурация screenos), где представлены такие разные фрагменты текста (последовательность строк, принадлежащих одной пользовательской конфигурации политики). каждая политика отличается номером (идентификатором). И каждая отдельная конфигурация политики заканчивается EXIT
3. вы хотите превратить «установить идентификатор политики 128» в «выход»? Если это так, ваше регулярное выражение неверно.
Ответ №1:
Вам не нужна опция Multiline
, вам нужно RegexOptions.Singleline
:
var matchesPolicy =
Regex.Matches(reader.ReadToEnd(), patternPolicy,RegexOptions.Singleline);
Смотрите Параметры регулярных выражений:
Многострочный m Использует многострочный режим, где ^ и $ соответствуют началу и концу каждой строки (вместо начала и конца входной строки). Для получения дополнительной информации см. раздел Многострочный режим.
Однострочные выражения используют однострочный режим, где точка (.) соответствует каждому символу (вместо каждого символа, кроме n). Для получения дополнительной информации см. раздел Однострочный режим.
Тогда вам, вероятно, нужно сделать свой квантификатор ленивым, чтобы избежать сопоставления с первого set policy (id)
до последнего exit
, добавив a ?
к вашему квантификатору:
string patternPolicy = @"set policy (id)(. ?)exit";
Другое дело, почему вы помещаете «id» в группу захвата? Это не имеет смысла.
string patternPolicy = @"set policy id(. ?)exit";
Комментарии:
1. Спасибо за ответ. Кажется, вы правы! здесь необходим однострочный режим. И шаблон тоже правильный. Итак, я получил группы конфигураций политик. Теперь мне нужно работать с каждым отдельно. каждая строка в группе политик должна быть преобразована. пожалуйста, скажите, есть ли у вас какие-либо идеи. это то, что я got.in ответ/
2. Я не понимаю, в чем ваша следующая проблема. вы получаете все совпадения в результирующей коллекции совпадений. Выполните итерацию по нему и делайте все, что хотите, с соответствующим текстом.
3. matchesPolicy — это коллекция совпадений