Lisp regexp números coincidentes con o sin identificadores de tipo constante (3.2 o 3.2f)

Pregunta: Estoy buscando crear una cara de bloqueo de fuente numérica en emacs, pero tengo problemas para obtener una expresión regular que coincida con lo que necesito. Esto es lo que tengo:

"\\<\\([0-9]*\\.?[0-9]*\\)+\\(d\\|f\\)?\\>"

Lo que quiero que coincida:

  1. 2
  2. 2.1
  3. 2.1f o 2.1d
  4. .1f o .1d

Lo que no quiero que coincida

  1. 2.
  2. 2.f o 2.d
  3. f o d

Problemas actuales:

Actualmente funciona principalmente, pero no coincide con números como .2 o .2f porque no recoge el (.) antes de los números. Actualmente, también coincide con una sola "f" o "d" en cualquier parte del código para que coincidan los nombres de variables como f o d. ¿Que me estoy perdiendo aqui? He jugado con esto cada hora del almuerzo durante la última semana más o menos, estoy perplejo.

preguntado el 12 de junio de 12 a las 15:06

Creo que todavía necesita una barra invertida adicional antes de la \. en tu solución. \. dentro de un literal de cadena produce el carácter único .; para que la barra invertida funcione como un carácter de escape de expresiones regulares, debe duplicarla: \\.. -

1 Respuestas

Podría usar una expresión regular como esta (sintaxis PCRE):

(\d*\.\d+|\d+)[fd]?

(Anclaje según sea necesario).

Traducido a expresiones regulares de estilo Emacs (por jon o):

"\\<\\([0-9]*\\.[0-9]+\\|[0-9]+\\)[df]?\\>"

contestado el 23 de mayo de 17 a las 13:05

Ese no estaba funcionando para mí, aunque se lee como si funcionara perfectamente. Terminé experimentando un poco y obtuve cosas locas como esta que no funciona: "\\\\(<[0-9]*\\(\\(\.[0-9]+\\)\\|[0-9]+\\)+\\)+\\(d\\|f\\)?\\>" y finalmente arriba con esto: "\\<\\([0-9]+\\|\.[0-9]+\\|[0-9]+\.[0-9]+\\)[fd]?\\>" que funciona casi a la perfección excepto que toma valores como f3. No captaría f o d por sí mismo, pero ¿f3 capta? Estas expresiones regulares me están matando. - jordan biondo

La expresión regular de Emacs en la respuesta todavía necesita una barra invertida duplicada antes de la primera | para que funcione. También podrías escribirlo así: "\\<\\([[:digit:]]*\\.[[:digit:]]+\\|[[:digit:]]+\\)[df]?\\>" - usuario725091

@JonO gracias por la solución, la expresión de Qtax funciona perfectamente ahora y es mucho más simple que la mía. - jordan biondo

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.