Регулярное выражение для ненулевого шестнадцатеричного значения - PullRequest
1 голос
/ 17 апреля 2009

Я ищу регулярное выражение, чтобы определить, является ли любое из значений в 32-битном шестнадцатеричном значении ненулевым.

Шаблоны данных выглядят как 0x00000000, и я хочу знать, когда любая из цифр отлична от нуля. Например, если 0x00001000 или 0x10000000 или 0xB000000 будут захвачены регулярным выражением, но не шаблоном 0x00000000. Прямо сейчас я выполняю комбинацию ходьбы

0x[^0]
0x0[^0]
0x00[^0]
...
0x0000000[^0]

Это сработает, но я, скорее всего, предпочитаю один паттерн. Спасибо.

Mark

Редактировать: я не упомянул, поскольку RegEx не требовался в программе, иначе я бы использовал другой подход, но я использовал RegEx для поиска значений в файле журнала с помощью UltraEdit. Я мог бы разработать программу или какое-то другое средство поиска, но я просто ленился, просто был честен. Решение Ben S работало как в дизайнере регулярных выражений UltraEdit, так и в Rad Software. Решение Rampion не работает ни в одном из инструментов, не знаю почему.

Ответы [ 8 ]

4 голосов
/ 17 апреля 2009

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

Если регулярное выражение g действительно необходимо, 0x0*[1-9a-fA-F][0-9a-fA-F]* должно сделать это.

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

Примечание : это будет соответствовать любой шестнадцатеричной длине, а не только 32 битам.

2 голосов
/ 17 апреля 2009

Почему бы не попробовать что-то немного другое. Тестирование на ненулевой гекс намного сложнее, чем тестирование на нулевой гекс. Так что тест на ноль и вручную делать не надо.

bool IsNonZeroHex(string input) {
  return !Regex.IsMatch(input, "^0x(0*)$");
}
2 голосов
/ 17 апреля 2009
/0x0*[1-9a-fA-F][0-9a-fA-F]*/

<i><atom>*</i> означает совпадение с атомом 0 или более раз, поэтому этот шаблон соответствует префиксу 0x, за которым следует 0 или более 0 s, за которым следует ненулевой гекс, за которым следует некоторый гекс.

1 голос
/ 30 мая 2019

Шестнадцатеричные числа фиксированного размера можно искать, используя отрицательный прогноз, как:

/(0x(?!0{8})[0-9a-fA-F]{8})/

Группа ищется, начиная с 0x

затем негативный взгляд вперед 0{8} (не найден)

иначе совпадают [0-9a-fA-F]{8}

Работает с PCRE, JavaScript, Python. Не знаю, какие редакторы поддерживают негативные прогнозы.

1 голос
/ 17 апреля 2009
/0x0*[^0]/
0 голосов
/ 17 апреля 2009
/0x0{0,7}[^0]/

'0x', затем от нуля до семи '0', за которыми следует что-то, что не '0'

0 голосов
/ 17 апреля 2009

Я думаю, что это должно охватывать все случаи (если это действительно должно быть регулярное выражение):

^0x(?=0*[1-9a-fA-F]0*)[0-9a-fA-F]{8}$
0 голосов
/ 17 апреля 2009

Конечно, простое сравнение строк, и если оно DOES NOT EQUAL "0x00000000", у вас есть совпадение.

Я слишком упрощаю это? Это только один FALSE случай, верно? Когда строка "0x00000000"?

Не используйте RegEx, если нет необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...