Регулярное выражение для захвата шестнадцатеричных чисел с нечетным количеством символов - PullRequest
0 голосов
/ 28 октября 2018

У меня есть список разделенных запятыми шестнадцатеричных чисел, как показано ниже,

    aaffd,123,1,d3213,aaa,f
    aaa,dd,1234,d,c

И я хочу, чтобы регулярное выражение для pcregrep соответствовало только строкам, содержащим шестнадцатеричные числа, где каждое шестнадцатеричное число имеет нечетное количество символов.

Должно совпадать:

    aaffd,123,1,d3213,aaa,f
    1
    2,345,1

Не должно совпадать:

    ad,ad
    1,23,1,333

Я пытаюсь использовать это регулярное выражение ([0-9a-f] ,? | ((?: (?: [0-9a-f] {2}) + [0-9a-f]),?)) +

Но он также фиксирует ненужные строки.Как показано в ссылке https://regex101.com/r/uvJcbD/5

Как захватить только строки, содержащие шестнадцатеричные числа, где каждое шестнадцатеричное число имеет нечетное количество символов?Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 28 октября 2018

Вы можете сопоставить нечетное количество символов, повторяя ноль или более раз этот диапазон [a-f0-9]{2}, а затем 1 раз этот диапазон.

Затем следует, повторяя предыдущий шаблон ноль или более раз, но перед ним следуетзапятая.

^(?:[a-f0-9]{2})*[a-f0-9](?:,(?:[a-f0-9]{2})*[a-f0-9])*$

Regex demo

Пояснение

  • ^Начало строки
  • (?: Группа без захвата
    • [a-f0-9]{2} Совпадение 2 раза символов a-f0-9
  • )* Закрытьгруппа без захвата и повторение 0+ раз
  • [a-f0-9] Совпадение символов a-f0-9
  • (?: Группа без захвата
    • , Совпадение
    • (?: Группа без захвата
      • [a-f0-9]{2} Совпадение 2 раза символов a-f0-9
    • )* Закрыть группу без захвата и повторить 0+умножить
    • [a-f0-9] Соответствовать символам a-f0-9
  • )* Закрыть группу без захвата
  • $ Конец строки
0 голосов
/ 28 октября 2018

Это должно сделать это:

^(?:\b\w(?:\w\w)*\b,?)*$

Это соответствует неограниченному количеству слов , содержащих нечетное количество символов.Он использует границу слова (\b) для определения начала и конца слов и допускает необязательную запятую (чтобы соответствовать последней).

Если вы хотите проверка синтаксиса также из шестнадцатеричных символов (т.е. только допустимых шестнадцатеричных символов) используйте

^(?:\b[a-f0-9](?:[a-f0-9]{2})*\b,?)*$

См. его (первый) здесь в regex101 .

0 голосов
/ 28 октября 2018

Это делает работу:

^(?=[0-9a-f,]+$)[^,](?:[^,]{2})*(?:,[^,](?:[^,]{2})*)*$

DEMO

...