Member 8029956 Ответов: 3

Я хочу получить подстроку для приведенной ниже строки с помощью регулярного выражения.


Входная строка -
GlobalLib://Library6/Master Copies/New folder_1/New folder_2/PLC_4

выход -
New folder_1/New folder_2

Также проверьте формат входной строки -
GlobalLib://
является фиксированным префиксом
Library6-это переменная с именем библиотеки.
Master Copies
это фиксированное имя.
New folder_1/New folder_2
это иерархия путей к папкам.
PLC_4 - это имя элемента библиотеки.
это логика поиска, которую я хочу сопоставить с нашим проектом по заданному пути.
1. используя регулярное выражение, я должен найти путь к папке, который является переменным, и в соответствии с данной строкой это
New folder_1/New folder_2

2. Также я хочу проверить входную строку с помощью регулярного выражения.

Что я уже пробовал:

Нужна помощь с вашей стороны.
Я пробовал несколько сценариев из сети, но не смог найти ни одного сценария, который подходит для этой проблемы.

Richard MacCutchan

Наверное проще просто использовать String.Split и String.Equals.

3 Ответов

Рейтинг:
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[/], регулярное выражение не найдет совпадения.

Рейтинг:
2

Patrice T

Всего лишь несколько интересных ссылок, которые помогут построить и отладить регулярное выражение.
Вот ссылка на документацию по регулярным выражениям:
perlre - perldoc.perl.org[^]
Вот ссылки на инструменты, помогающие создавать регулярные выражения и отлаживать их:
.Объем тестер регулярное выражение - регулярное выражение шторм[^]
Регулярное Средство Выражения Эспрессо [^]
RegExr: Learn, Build, & Test RegEx[^]
Онлайн-тестер регулярных выражений и отладчик: PHP, PCRE, Python, Golang и JavaScript[^]
Этот пример показывает вам регулярное выражение в виде красивого графика, который действительно полезен для понимания того, что делает регулярное выражение:
Debuggex: онлайн-тестер визуальных регулярных выражений. JavaScript, Python и PCRE.[^]
Этот сайт также показывает регулярное выражение в красивом графике, но не может проверить, что соответствует регулярному выражению:
Regexper[^]


Рейтинг:
17

OriginalGriff

Попробовать это:

/[^/]+?/[^/]+?(?=/[^/]+?$)
Если вы собираетесь играть с Regxes, получите копию Экспрессо[^] - это бесплатно, и он проверяет и генерирует регулярные выражения.


Maciej Los

Хорошо, но не соответствует всем критериям ОП, которые были определены:

1. using regex i have to find the folder path which is variable and as per the given string this is
2. Also i want to verify the input string using regex.