Регулярное выражение для сопоставления цвета ARGB (-44830298)

StackOverflow https://stackoverflow.com/questions/1512339

  •  19-09-2019
  •  | 
  •  

Вопрос

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

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:Цвет
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top