C # регулярное выражение не соответствует строке - PullRequest
2 голосов
/ 03 ноября 2011

У меня есть строка в следующем формате: $ 20, $ 40, $ AA, $ FF. В основном, шестнадцатеричные числа, и они могут иметь много байтов. Я хочу проверить, есть ли строка в вышеуказанном формате, поэтому я попробовал что-то вроде этого:

        string a = "$20,$30,$40";

        Regex reg = new Regex(@"$[0-9a-fA-F],");
        if (a.StartsWith(string.Format("{0}{1}", reg, reg)))
            MessageBox.Show("A");

Кажется, это не работает, я что-то упускаю?

Ответы [ 4 ]

14 голосов
/ 03 ноября 2011

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

"\$[0-9a-fA-F]{2},"

В любом случае AFAIK это не будет работать с вашей строкой, так как она не заканчивается на ",". Вы можете попробовать:

"^(\$[0-9a-fA-F]{2},?)+$"

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

Regex reg = new Regex(@"^(\$[0-9A-F]{2},?)+$", RegexOptions.IgnoreCase);

РЕДАКТИРОВАТЬ: исправлено, чтобы точно соответствовать 2 шестнадцатеричные цифры.

РЕДАКТИРОВАТЬ: возможно, вам следует написать проверку регулярного выражения, как:

if (Regex.IsMatch(a,@"^(\$[0-9A-F]{2},?)+$",RegexOptions.IgnoreCase)) 
{
    // Do whatever
}
3 голосов
/ 03 ноября 2011

Я думаю, что вам не хватает квантификатора:

"\$[0-9a-fA-F]+,"

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

2 голосов
/ 03 ноября 2011

Есть 3 вещи, которые необходимо изменить:

Необходимо экранировать символ $, поскольку он обозначает конец строки.

\$

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

^(\$[0-9a-fA-F]{2},+)+\$[0-9a-fA-F]{2}$

Необходимо изменить код для использования Regex.IsMatch.

string a = "$20,$30,$40"; 
if (Regex.IsMatch(a,@"^(\$[0-9a-fA-F]{2},+)+\$[0-9a-fA-F]{2}$",RegexOptions.IgnoreCase))
        MessageBox.Show("A");

PS:

Если во входной строке есть пробел, такой как табуляция или пробел между ними, то это регулярное выражение нужно будет изменить.В таких случаях вы должны использовать «\ s» в правильных позициях.Например, если у вас есть пробелы вокруг запятых вроде

string a = "$20 ,$30, $40";

, вам нужно настроить свой RegEx следующим образом:

^(\$[0-9a-fA-F]{2}\s*,+\s*)+\$[0-9a-fA-F]{2}\s*$

Ссылки:

  1. C # Regex Testers
  2. о Regex.IsMatch (вместо использования Match)
  3. C # Шпаргалка регулярного выражения

Старый ответ ниже (игнорировать):

Попробуйте это:

"\$[0-9a-fA-F]{2}?[,]{0,1}"
1 голос
/ 03 ноября 2011

Возможно, вы также захотите добавить модификатор повтора к вашему набору, чтобы он стал;

"\$[0-9a-fA-F]+,"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...