es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Expresión regular para coincidir con una constante entera literal.

Estaba pensando en analizar una lista de enteros (de una cadena de propiedad). Sin embargo, me gustaría ir más allá de los valores decimales positivos y negativos y analizar cualquier cadena que indique un literal de entero de Java (JLS 17) como se puede encontrar en el código fuente. De manera similar, me gustaría ser indulgente con respecto a cualquier prefijo, separador y apéndice alrededor de los enteros mismos. En otras palabras, quiero encontrarlos usando llamadas repetidas a Matcher.find().

¿Existe una expresión regular que coincida con todos los literales de enteros de Java posibles? No es necesario comprobar los límites superiores e inferiores.


Aunque he vinculado explícitamente con JLS, mostraré algunos números válidos e inválidos:

  • -1: se encuentra el 1, pero el menos es un operador unario (ajustaré si es necesario)
  • 0x00_00_00_0F: se encuentra el valor quince como dígitos hexadecimales, con una barra baja para separar los dos nibbles
  • 0b0000_1111: se encuentra el valor quince en binario
  • 017: se encuentra el valor octal de quince
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para coincidir con todas las posibles literales enteras de Java, se puede utilizar la siguiente expresión regular:

    -?(?:0|[1-9][0-9]*|0x[0-9a-fA-F]+|0b[01]+|0[0-7]*)(?:[lL]|[uU]|[lL][uU]|[uU][lL])?
    

    Esta regex coincide con cualquier combinación de los siguientes patrones:

    • Un signo menos opcional (-).
    • Cualquiera de los siguientes:
      • Un 0 seguido de cualquier cantidad de dígitos octales ([0-7]*).
      • Un dígito distinto de cero ([1-9]) seguido de cualquier cantidad de dígitos ([0-9]*).
      • Un 0 seguido de una x y uno o más dígitos hexadecimales ([0-9a-fA-F]+).
      • Un 0 seguido de una b y uno o más dígitos binarios ([01]+).
    • Un sufijo opcional que denota el tipo de número ([lL]|[uU]|[lL][uU]|[uU][lL]). Esto puede ser uno de los siguientes:
      • l o L para el tipo long.
      • u o U para el tipo unsigned.
      • Tanto l como u o L y U para el tipo unsigned long.

    Esta regex está diseñada para ser indulgente con respecto a cualquier prefijo, separador y apéndice alrededor de los enteros en sí mismos, como se solicitó en la pregunta. Se pueden usar llamadas repetidas a Matcher.find() para encontrar todas las coincidencias en la cadena de entrada.

Comments are closed.