Не понимаю в чём проблема , тут нормально ищет.
А в 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}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Пишу небольшую прогуСмысл ее такой: есть textBox, в который я вствляю в столбик цифры: целые и с плавающей точкой
У меня имеется массив в котором содержатся данные типа
Мне нужно сравнить объекты между собой, которые еще являются массивамиПотом сортировать их методом пузырька