2009-04-01 3 views

Répondre

7

Quelque chose comme ceci:

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

ou cela, si vous voulez exclure l'option "0x" du match:

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

L'ancien est:

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

ce dernier serait:

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

Les derniers matches:

 
- 123456 
- 0x123456 

mais pas:

 
- 0y123456 

Pour correspondre à des chiffres hexadécimaux (comme "0x" implique), l'utilisation [0-9A-Fa-f] à la place du "\d".

2

Pourriez-vous spécifier la question suivante? Comment voulez-vous utiliser le match? Quelle implémentation de langage/regexp.

Un simple qui fonctionnera avec de nombreuses implémentations regexp langages est.

(?:0x)?\d+ 
2

Si vous voulez que la chaîne entière pour correspondre (rien d'autre que les chiffres):

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

J'utilise la classe [0-9] ici pour être aussi portable que possible. Vous préférerez peut-être utiliser \d partout où il est implémenté.

Il fonctionne comme ceci:

  • match, le début de la chaîne: ^
  • correspondre à une option "0x": (0x)?
  • correspondre à l'un ou plusieurs chiffres: [0-9]+
  • match de la fin de la chaîne: $

ets plus difficile si une précédente « 0x » signifie nombre hexadécimal, et omis signifie nombre décimal:

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

Cela a également protège contre les nombres décimaux commençant par 0 ...

+0

+1 pour distinction entre hex et dec. – mouviciel

1

expression régulière formelle:

(0x)?[0-9]+ 
-3
['0x']?[0-9]+ 

Ceci est plus de texte pour répondre au minimum 30 caractères.

+0

cela va sélectionner une chaîne contenant des chiffres, probablement précédé par "0", "x" ou "'". –

+0

La première partie correspondrait à l'ensemble du texte '0x' ou non (l'expression est en notation BNF.) La deuxième partie correspond à une chaîne de chiffres, ou plutôt à une chaîne de nombres, la présence d'un caractère délimité n'étant pas mentionnée. – sangupta

1

J'aime toujours fournir les REs très de base afin qu'ils travailleront sur tous les moteurs RE, donc:

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

Avec des conditions aux limites appropriées (sur les anciens moteurs RE, ce serait [ \t]), que devrait travailler partout.

Cependant, il semble que vous êtes désireux caractères hexadécimaux, si le 0x est correct, alors peut-être que vous êtes après:

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

ou son équivalent dans la plupart des autres excellentes suggestions pour les plus avancés moteurs.

0

Le 0x que vous mentionnez suggère que vous souhaitez capturer un nombre hexadécimal. Dans ce cas, je suggère:

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

[:xdigit:] est la liste de tous hexadécimal en notation Posix.

-2

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

+0

L'OP n'a pas précisé que la chaîne de chiffres ne pouvait pas commencer avec un tas de 0s –

+0

Didnt., mais il semble évident. – nothrow

0

Tout dépend de ce que vous . dire par un certain nombre, et dans quel contexte les chiffres sont autorisés, je suppose que les chiffres précédés de 0x sont des nombres hexadécimaux et peuvent donc aussi contenir AF et af

Compte tenu de cette chaîne de test. "a 012 0xa 4_56 num:8 42!"

cette expression régulière correspondances "012", "0xa", "4", "56", "8" et "42":

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

correspond à cette expression "012", "0xa", "8" et "42":

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

correspond à cette expression "0xa", "8" et "42":

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

correspond à cette expression "012" et "0xa" :

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

Cette expresison régulière correspond "0xa":

(?<=\s)(0x[\dA-Fa-f]+|[1-9]\d*)(?=\s) 
Questions connexes