Bad quantifier. Unity

175
25 октября 2021, 09:50

Не понимаю в чём проблема , тут нормально ищет.

А в 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 = "";
        }
    }
Answer 1

Основная причина ошибки — несовместимость регулярных выражений 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/")));

Пример кода

Answer 2

{5,30}+ — ошибка. Вы указываете сразу два квантификатора: {5,30}, который говорит «от 5 до 30», и +, который говорит «от 1 до +∞». Вот верное регулярное выражение, без лишнего +:

[\/]+[Resources\/Icon\/]+[0-9a-zA-Z]{5,30}[.]+[0-9a-zA-Z]{1,10}
READ ALSO
Список цифр в textBox или listBox

Список цифр в textBox или listBox

Пишу небольшую прогуСмысл ее такой: есть textBox, в который я вствляю в столбик цифры: целые и с плавающей точкой

237
Как сравнить даты в MS Access?

Как сравнить даты в MS Access?

В таблице столбцы date_in и date_out в виде "1410

164
Ассоциировать данные массива с данными из другого массива

Ассоциировать данные массива с данными из другого массива

У меня имеется массив в котором содержатся данные типа

250
Как сравнить объекты между собой, которые еще являются массивами?

Как сравнить объекты между собой, которые еще являются массивами?

Мне нужно сравнить объекты между собой, которые еще являются массивамиПотом сортировать их методом пузырька

66