Регулярное выражение для совпадения с произвольной длиной строки чисел, которой может предшествовать или не быть 0x - PullRequest
2 голосов
/ 01 апреля 2009

Мне было интересно, не могли бы вы помочь мне сформулировать регулярное выражение, соответствующее следующему шаблону?

Любая строка чисел произвольной длины, которой может предшествовать или не предшествовать 0x.

Ответы [ 9 ]

7 голосов
/ 01 апреля 2009

Примерно так:

\b(?:0x)?\d+\b

или это, если вы хотите исключить необязательный "0x" из матча:

(?:(?<=\b0x)|\b)\d+\b

Бывший:

- a word boundary
- "0x", optional
- decimal digits, at least one
- a word boundary

последний будет:

- choose
  - either a position preceded by
     - a word boundary
     - "0x"
  - or a word boundary
- decimal digits, at least one
- a word boundary

Последнее соответствует:

- 123456
- 0x123456

но не:

- 0y123456

Чтобы сопоставить шестнадцатеричные цифры (как подразумевается в вашем 0x), используйте [0-9A-Fa-f] вместо "\d".

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

Если вы хотите, чтобы вся строка совпадала (только цифры):

^(0x)?[0-9]+$

Я использую класс [0-9], чтобы быть максимально переносимым. Вы можете предпочесть использовать \d везде, где реализовано.

Работает так:

  • соответствует началу строки: ^
  • соответствует необязательному «0x»: (0x)?
  • соответствует одной или нескольким цифрам: [0-9]+
  • соответствует концу строки: $

Становится труднее, если предыдущий «0x» означает шестнадцатеричное число, а опущенный означает десятичное число:

\b((0x[0-9a-zA-Z]+)|([1-9][0-9]*))\b

Это также защищает от десятичных чисел, начинающихся с 0 ...

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

Не могли бы вы уточнить вопрос? Как вы хотите использовать матч? Какой язык / регулярное выражение реализации.

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

(?:0x)?\d+
1 голос
/ 01 апреля 2009

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

(0x)?[0-9][0-9]*

При подходящих граничных условиях (на старых двигателях RE это будет [ \t]), это должно работать везде.

Тем не менее, похоже, что вам нужны шестнадцатеричные символы, если 0x является правильным, так что, возможно, вы ищете:

(0x)?[0-9A-Fa-f][0-9A-Fa-f]*

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

1 голос
/ 01 апреля 2009

Формальное регулярное выражение:

(0x)?[0-9]+
0 голосов
/ 01 апреля 2009

Все зависит от того, что вы подразумеваете под числом, и в каком контексте разрешены цифры. Я предполагаю, что числа, которым предшествует 0x, являются шестнадцатеричными числами и, следовательно, могут также содержать A-F и a-f.

С учетом этой тестовой строки: "a 012 0xa 4_56 num:8 42!"

Это регулярное выражение соответствует "012", "0xa", "4", "56", "8" и "42":

(0x[\dA-Fa-f]+|\d+)

Это регулярное выражение соответствует "012", "0xa", "8" и "42":

\b(0x[\dA-Fa-f]+|\d+)\b

Это регулярное выражение соответствует "0xa", "8" и "42":

\b(0x[\dA-Fa-f]+|[1-9]\d*)\b

Это регулярное выражение соответствует "012" и "0xa":

(?<=\s)(0x[\dA-Fa-f]+|\d+)(?=\s)

Это регулярное совпадение совпадений "0xa":

(?<=\s)(0x[\dA-Fa-f]+|[1-9]\d*)(?=\s)
0 голосов
/ 01 апреля 2009

\ б ((0x [[: xdigit:]] +) | ((0 | ([1-9] [0-9] +))) \ б

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

Упомянутое вами 0x предполагает, что вы хотите записать шестнадцатеричное число. В этом случае я предлагаю:

(?:0x)?[[:xdigit:]]+

где [:xdigit:] - список всех шестнадцатеричных чисел в нотации Posix.

0 голосов
/ 01 апреля 2009
['0x']?[0-9]+

Это больше текста для соответствия минимум 30 символов.

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