Регулярное сопоставление всех персонажей до достижения персонажа, но также включает последнее совпадение - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь найти все коды Color Hex, используя Regex.

У меня есть это строковое значение, например - #FF0000FF#0038FFFF#51FF00FF#F400FFFF, и я использую этот шаблон:

#.+?(?=#)

, чтобы соответствоватьвсе символы, пока он не достигнет #, но остановится на последнем символе, который должен быть последним совпадением.

Я вроде новичок в этом материале Regex.Как я мог также получить последний матч?

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

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

(?i)#[a-f0-9]+

0 голосов
/ 14 ноября 2018

Ваше регулярное выражение не соответствует последнему значению, потому что вашему регулярному выражению (с положительным прогнозом (?=#)) требуется, чтобы # появилось после уже использованного значения, а в конце строки нет #.

Вы можете использовать

#[^#]+

См. Демоверсию regex

Класс отрицательных символов [^#] соответствует любому символу, кроме # (+ означает 1 или более вхождений ) и не требует, чтобы # появлялся сразу справа от текущего совпадающее значение.

В C # вы можете собрать все совпадения, используя

var result = Regex.Matches(s, @"#[^#]+")
    .Cast<Match>()
    .Select(x => x.Value)
    .ToList();

Более точный шаблон, который вы можете использовать - #[A-Fa-f0-9]{8}, он соответствует #, а затем любым 8 шестнадцатеричным символам, цифрам или буквам от a до f и A до F.

...