Регулярное выражение для соответствия цвету ARGB (-44830298) - PullRequest
0 голосов
/ 03 октября 2009

Я пытаюсь получить информацию о цвете, которая хранится в текстовом файле, а затем использовать этот цвет в качестве переднего цвета для метки. НО, во время выполнения, когда я нажимаю кнопку, чтобы сделать это, он не дает мне никаких сообщений об ошибках или что-нибудь. код у меня ниже:

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);

У меня есть и другое регулярное выражение для других информационных файлов 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

Итак, регулярное выражение работает, оно корректно получает все остальные детали, но просто не получает информацию о цвете.

Ответы [ 7 ]

7 голосов
/ 05 ноября 2009

- не соответствует \d. Кроме того, если вы делаете не жадное совпадение на \d+, будет записана только первая цифра, поскольку она удовлетворяет регулярному выражению. Измените свое регулярное выражение на (-?\d+), чтобы оно совпадало с необязательным - в начале вашего номера и числом цифр, равным числу, вплоть до (но не включая) символа, следующего за номером (новая строка, конец строки). строка, ...).

6 голосов
/ 05 ноября 2009

Попробуйте это регулярное выражение и посмотрите, работает ли оно.

(. +?) \ Г \ п "" ([^ ""] +) "" \ г \ п (\ d +), \ с (\ d +) \ г \ п ([\ ш \ S] . *) \ г \ п (\ d + \ d +) \ г \ п (-? \ d +) * * +1003

Ваше регулярное выражение, похоже, ищет "после значения размера шрифта.

Кроме того, ваш цвет ARGB будет в групповом совпадении 7, а не 5.

1 голос
/ 10 ноября 2009

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

Но я могу предложить еще одну вещь. Вот последняя часть регулярного выражения, начиная с соответствия размера шрифта:

..."(\d+\.\d+)\r\n(-?\d+)"

Что должно совпадать с

...
14.0
-55794414

Поскольку у вас есть совпадение для новой строки сразу после совпадения для цифр размера шрифта, совпадение будет неудачным, если у вас будет пробел после 14.0. Попробуйте с

..."(\d+\.\d+)\s*\r\n(-?\d+)"

, который должен работать как с пробелами, так и без них. (В зависимости от вашего механизма регулярных выражений, "\s*" может быть лучше, чем "\s*\r\n".)

На самом деле существует множество других вещей, которые могут пойти не так. Как правило, проще разделить строки и работать с меньшими регулярными выражениями.

Полагаю, вы уже знаете цитату?

Некоторые люди, когда сталкиваются с проблема, подумай "Я знаю, я буду использовать регулярные выражения. "Теперь у них есть две проблемы.

1 голос
/ 08 ноября 2009

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

Вот несколько вещей, которые вы можете попробовать:

Запустите это с другим вводом, т.е. вместо использования этого числа:

-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, легко понять, в чем проблема.

1 голос
/ 03 октября 2009

Я бы установил точку останова на строке с ошибкой и посмотрел бы, что на самом деле match.Groups[5].Value.

Могу поспорить, что он не может быть преобразован в int.

0 голосов
/ 07 ноября 2009

Вы можете использовать это регулярное выражение:

@"(.+)\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 : X
  • 3 : Y
  • 4 : шрифт
  • 6 : Размер
  • 7 : Цвет
0 голосов
/ 03 октября 2009

В ваших регулярных выражениях есть только 4 группы, но вы пытаетесь получить доступ к группам от 5 до 8, которые будут пустыми строками, и пустая строка не может быть проанализирована как целое число с помощью Int32.Parse.

...