Регулярное выражение для сопоставления цвета ARGB (-44830298)
Вопрос
я пытаюсь получить информацию о цвете, которую я сохранил в текстовом файле, а затем использовать этот цвет в качестве цвета переднего цвета для метки.НО, когда я нажимаю кнопку, чтобы сделать это, во время выполнения я не получаю никаких сообщений об ошибках или чего-то еще.код, который у меня есть, приведен ниже:
MatchCollection lines = Regex.Matches(File.ReadAllText(Path), @"(.+?)\r\n""([^""]+)""\r\n(\d+),\s(\d+)\r\n([\w\s]*)\r\n(\d+\.\d+)""\r\n(\d+?)");
foreach (Match match in lines)
int color = Int32.Parse(match.Groups[5].Value);
У меня есть и другое регулярное выражение для других файлов info Inn, но проблема не в другом регулярном выражении.проблема в регулярном выражении, которое я только что добавил, чтобы попытаться сопоставить цвет (argb).это в конце строки:
\r\n(\d+?)
Насколько я понимаю, приведенное выше маленькое регулярное выражение означает следующее:«Найдите возврат каретки и новую строку, а затем 1 или несколько цифр, но не жадничайте».это правильно?
может кто-нибудь, пожалуйста, помогите мне с этим.большое спасибо.
Примечание:Информация о цвете, сохраненная в текстовом файле, представляет собой отрицательное число (цвет ARGB):
-16744193
Содержимое файла такое:
Control
Control Text
Control Location
Control Font Name
Control Font Size
Control Font Color
Объяснение:
Label
"this is a label"
23, 77
Tahoma
14.0
-55794414
Итак, регулярное выражение работает, оно правильно получает все остальные детали, но просто не получает информацию о цвете.
Решение
Ваше регулярное выражение нет проблема.Ваше регулярное выражение, как и то, которое дал Вим, работает нормально.Таким образом, проблема должна быть в том, как обрабатывается ввод.
Вот некоторые вещи, которые вы можете попробовать:
Запустите это с другим вводом, т.е.вместо использования этого номера:
-16744193
Вместо этого используйте что-то вроде этого:
100
-100
Затем распечатайте значение после этой строки:
int fcolor = Int32.Parse(match.Groups[7].Value);
И посмотрите, что это такое.
Еще одна вещь, позволяющая сэкономить время, — это распечатать значения в
match.Groups[1].Value
match.Groups[2].Value
match.Groups[3].Value
match.Groups[4].Value
match.Groups[5].Value
match.Groups[6].Value
match.Groups[7].Value
match.Groups[8].Value
И разместите их здесь.Это облегчит вам и всем сотрудникам SO понимание проблемы.
Другие советы
-
не соответствует \d
.Кроме того, если вы выполняете нежадное сопоставление на \d+
будет записана только первая цифра, поскольку она удовлетворяет регулярному выражению.Измените регулярное выражение на (-?\d+)
чтобы соответствовать дополнительному -
в начале вашего номера и столько цифр, сколько есть в номере, до (но не включая) символа, следующего за номером (новая строка, конец строки,...).
Попробуйте это регулярное выражение и посмотрите, работает ли оно.
(.+?) ""([^""]+)"" (\d+),\s(\d+) ([\w\s]*)\ r (\d+.\d+) (-?\d+)
Похоже, ваше регулярное выражение ищет " после значения размера шрифта.
Кроме того, ваш цвет ARGB будет соответствовать групповому совпадению 7, а не 5.
Я бы поставил точку останова на строке с ошибкой и посмотрел, что match.Groups[5].Value
на самом деле.
Держу пари, что его нельзя преобразовать в int.
Распечатка значений совпадений, как предложено в другом месте, будет полезна, а также сократит регулярное выражение, чтобы было легче изолировать проблему.
Но я могу предложить еще одну вещь.Вот последняя часть регулярного выражения, начиная с соответствия размера шрифта:
..."(\d+\.\d+)\r\n(-?\d+)"
Который должен соответствовать
...
14.0
-55794414
Поскольку у вас есть совпадение для новой строки сразу после совпадения цифр размера шрифта, сопоставление завершится неудачей, если у вас есть пробел после 14.0.Попробуйте с
..."(\d+\.\d+)\s*\r\n(-?\d+)"
который должен работать как с конечными пробелами, так и без них.(В зависимости от вашего механизма регулярных выражений, просто "\s*"
может быть лучше, чем "\s*\r\n"
.)
На самом деле есть масса других вещей, которые могут пойти не так.Обычно проще разделить строки и работать с меньшими регулярными выражениями.
Полагаю, вы уже знаете цитату?
Некоторые люди, когда сталкивались с проблемой, думают: «Я знаю, я буду использовать регулярные выражения». Теперь у них есть две проблемы.
У вас есть только 4 группы в ваших регулярных выражениях, но вы пытаетесь получить доступ к группам с 5 по 8, которые будут пустыми строками, а пустая строка не может быть проанализирована как целое число с помощью Int32.Parse.
Вы можете использовать это регулярное выражение:
@"(.+)\r\n""([^""]+)""\r\n(\d+),\s(\d+)\r\n([\w\s]*)\r\n(\d+\.\d+)\r\n(-?\d+)"
Пример использования, из которого видно, что это работает:
string value = @"Label
""this is a label""
23, 77
Tahoma
14.0
-55794414
Label
""this is a label""
23, 77
Tahoma
14.0
-55794415";
MatchCollection lines = Regex.Matches(
value,
@"(.+)\r\n""([^""]+)""\r\n(\d+),\s(\d+)\r\n([\w\s]*)\r\n(\d+\.\d+)\r\n(-?\d+)");
var colors = new List<int>();
foreach (Match match in lines)
{
colors.Add(Int32.Parse(match.Groups[7].Value));
}
CollectionAssert.AreEquivalent(new[] { -55794414, -55794415}, colors);
В этом примере у нас есть 2 метки разных цветов, как видно, регулярное выражение соответствует цветам.
Группы регулярного выражения:
- 0:Контроль
- 1:Текст
- 2:Икс
- 3:Да
- 4:Шрифт
- 6:Размер
- 7:Цвет