Рейтинг:
21
Maciej Los
Приведенный ниже код используется для проверки всего оператора. Я использовал группы для проверки каждой части строки. Видеть:
string s = "GlobalLib://Library5/Master Copies/New folder_1/New folder_2/PLC_3";
string pattern = @"^(?<prefix>GlobalLib://Library\d{1,})(?<constant>/Master Copies/)(?<folders>.*/)(?<libraryname>.*)$";
Match rm = Regex.Match(s, pattern);
foreach(Group grp in rm.Groups)
{
Console.WriteLine("Group name: {0}", grp.Name);
Console.WriteLine("Value: {0}", grp.Value);
Console.WriteLine();
}
Итак, если вы хотите вернуть только группу "папки", используйте это:
var folders= rm.Groups["folders"];
Console.WriteLine("{0}", folders.Value);
//returns: New folder_1/New folder_2/
По аналогии, чтобы получить имя библиотеки:
var lib= rm.Groups["libraryname"];
Console.WriteLine("{0}", lib.Value);
Чтобы проверить, соответствует ли вся строка шаблону, используйте:
var valid = Regex.IsMatch(s, pattern);
Console.WriteLine("{0}", valid);
Member 8029956
Library5-это имя папки библиотеки, которое может быть любым именем, если не будет фиксированного формата, то каким будет регулярное выражение решения для этого?
Member 8029956
Я могу найти, что я думаю, что это должно быть
шаблон строки = @"^(?&ЛТ;префикс&ГТ;GlobalLib://)(?&ЛТ;имябиблиотеки&ГТ;.*)(?&л;константа&ГТ;/мастер-копий/)(?&ЛТ;папки&ГТ;.*/)(?&ЛТ;libraryobjectname&ГТ;.*)$";
в этом регулярном выражении, если я ставлю /// после префикса, то последний /приходит под именем библиотеки, но мое ожидание имя библиотеки не должно содержать / it его имя.
Строка -
строка s = "GlobalLib:///Library5/Master Copies/New folder_1/New folder_2/PLC_3";
Префикс - GlobalLib://
Название библиотеки - /Library5
Константа - /Мастер-Копии/
Путь к папке - New folder_1/New folder_2/
Наименование объекта библиотека - PLC_3
Все в порядке, только имя библиотеки должно быть Library5, а не /Library5, в этом случае это должно дать некоторую ошибку.
Maciej Los
По-моему, выглядит идеально.
Member 8029956
если моя строка "GlobalLib:///Library5/мастер-копий/новый folder_1/новый folder_2/PLC_3", то имя библиотеки - /Library5 но я хочу, чтобы библиотека название должно быть только "Library5" не "Library5", и он должен потерпеть неудачу, если имя содержит какие-либо библиотеки /. Можно ли проверить это в том же регулярном выражении или мне нужно создать новое регулярное выражение, чтобы проверить библиотеку, которая не содержит никаких "/"?
Maciej Los
Если [GlobalLib] заканчивается на три раза [///], то измените это: (?<prefix>GlobalLib://) на: (?<prefix>GlobalLib:///). В этом случае имя библиотеки будет возвращать не [\Library5], а [Library5]. Проверить это.
Member 8029956
Извините за недопонимание, GlobalLib заканчивается на // правильно, но если какой-либо пользователь поставил /// регулярное выражение должно потерпеть неудачу, но оно проходит сейчас и третье / приходит под именем библиотеки.
Пожалуйста, дайте мне знать, если вам это ясно.
Maciej Los
Настоящий кодекс:
string pattern = @"^(?<prefix>GlobalLib://)(?<libraryname>.*)(?<constant>/Master Copies/)(?<folders>.*/)(?<libraryobjectname>.*)$";
string s = "GlobalLib://Library5/Master Copies/New folder_1/New folder_2/PLC_3";
Match rm = Regex.Match(s, pattern);
foreach(Group grp in rm.Groups)
{
Console.WriteLine("Group name: {0}", grp.Name);
Console.WriteLine("Value: {0}", grp.Value);
Console.WriteLine();
}
работает как и ожидалось:
Group name: 0
Value: GlobalLib://Library5/Master Copies/New folder_1/New folder_2/PLC_3
Group name: prefix
Value: GlobalLib://
Group name: libraryname
Value: Library5
Group name: constant
Value: /Master Copies/
Group name: folders
Value: New folder_1/New folder_2/
Group name: libraryobjectname
Value: PLC_3
Member 8029956
шаблон строки = @"^(?&ЛТ;префикс&ГТ;GlobalLib://)(?&ЛТ;имябиблиотеки&ГТ;.*)(?&л;константа&ГТ;/мастер-копий/)(?&ЛТ;папки&ГТ;.*/)(?&ЛТ;libraryobjectname&ГТ;.*)$";
строка s = "GlobalLib:///Library5/Master Copies/New folder_1/New folder_2/PLC_3";
Совпадение rm = регулярное выражение.Матч(с рисунком);
по каждому элементу(группе ВРП в РМ.Группы)
{
Приставка.WriteLine("имя группы: {0}", grp.Name);
Приставка.WriteLine("Value: {0}", grp.Value);
Приставка.метод WriteLine();
}
Выход:
Название группы: 0
Значение: GlobalLib://Library5/Master Copies/New folder_1/New folder_2/PLC_3
Имя группы: префикс
Значение: GlobalLib://
Имя группы: libraryname
Значение: /Library5
Название группы: константа
Значение: /Мастер-Копии/
Имя группы: папки
Значение: New folder_1/New folder_2/
Имя группы: libraryobjectname
Значение: PLC_3
значение имени группы libraryname равно /Library5, что нормально, но если значение имени библиотеки содержит/, то регулярное выражение.Выполняется(с рисунком); должна возвращать false, как в имени библиотеки не ожидаются.
Maciej Los
О.... Хорошо. Теперь я понимаю. Ну, вы должны проверить, не содержит ли имя библиотеки лишнего [/]. Если я найду время, я улучшу свой ответ.
[РЕДАКТИРОВАТЬ]
Попробовать это:
string pattern = @"^(?<prefix>\bGlobalLib://\b)(?<libraryname>\b[^/].*\b)(?<constant>\b/Master Copies/\b)(?<folders>.*/)(?<libraryobjectname>.*)$";
Когда GlobalLib будет заканчиваться на 3x[/], регулярное выражение не найдет совпадения.