Не понимаю в чём проблема , тут нормально ищет.
А в Unity ругается:
ArgumentException: parsing "[\/]+[Resources\/Icon\/]+[0-9a-zA-Z]{5,30}+[.]+[0-9a-zA-Z]{1,10}" - Bad quantifier.
Parameter name: [\/]+[Resources\/Icon\/]+[0-9a-zA-Z]{5,30}+[.]+[0-9a-zA-Z]{1,10}
System.Text.RegularExpressions.Syntax.Parser.ParseGroup (System.Text.RegularExpressions.Syntax.Group group, RegexOptions options, System.Text.RegularExpressions.Syntax.Assertion assertion)
System.Text.RegularExpressions.Syntax.Parser.ParseRegularExpression (System.String pattern, RegexOptions options)
System.Text.RegularExpressions.Regex.CreateMachineFactory (System.String pattern, RegexOptions options)
System.Text.RegularExpressions.Regex.InitNewRegex ()
System.Text.RegularExpressions.Regex.Init ()
Сама функция trimLink():
void trimLink() {
string URLiconObj="D:/Unity/terranetools.git/Assets/Resources/Icon/C0092173000.png";
string pattern = @"[\/]+[Resources\/Icon\/]+[0-9a-zA-Z]{5,30}+[.]+[0-9a-zA-Z]{1,10}";
var result = Regex.Matches(URLiconObj, pattern).Cast<Match>().ToList();
if(result.Count>=0) {
URLiconObj = result[0].ToString();
} else {
URLiconObj = "";
}
}
Основная причина ошибки — несовместимость регулярных выражений PCRE и .NET.
{5,30}+ не является двойным квантификатором, это один "сверхжадный" кванитификатор означает от 5 до 30 без возможности пересмотра найденной последовательности символов (при отсутствии совпадения последующих шаблонов) в квантифицируемой подмаске. Проблема только в том, что этот "сверхжадный" квантификатор не поддерживается библиотекой регулярных выражений .NET. Вам нужно использовать лишь {5,30}.
Кроме того, [Resources\/Icon\/]+ — это символьный класс, который находит R, e, s, o, u, r, c, s, /, I, n, один и более раз. Необходимо убрать скобки и +, Resources/Icon/.
НЕ НАДО экранировать символы /, косая черта не является специальным метасимволом в регулярных выражениях. Он экранируется только в литералах, где используется в качестве разделителя. В .NET такая форма записи не поддерживается.
Для поиска единственно возможного совпадения используется не Regex.Matches, а Regex.Match.
Если вам очень нужно использовать подход с регулярными выражениями, используйте
void trimLink() {
string URLiconObj="D:/Unity/terranetools.git/Assets/Resources/Icon/C0092173000.png";
string pattern = @"/Resources/Icon/[0-9a-zA-Z]{5,30}\.[0-9a-zA-Z]{1,10}";
var result = Regex.Match(URLiconObj, pattern);
URLiconObj = result.Success ? result.Value : "";
}
См. пример работы выражения в .NET-совместимом онлайн-сервисе.
Если нужно получить подстроку, начиная от /Resources/Icon/, используйте
string URLiconObj="D:/Unity/terranetools.git/Assets/Resources/Icon/C0092173000.png";
Console.WriteLine(URLiconObj.Substring(URLiconObj.IndexOf("/Resources/Icon/")));
Пример кода
{5,30}+ — ошибка. Вы указываете сразу два квантификатора:
{5,30}, который говорит «от 5 до 30», и +,
который говорит «от 1 до +∞». Вот верное регулярное выражение, без
лишнего +:
[\/]+[Resources\/Icon\/]+[0-9a-zA-Z]{5,30}[.]+[0-9a-zA-Z]{1,10}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей