Haciendo caso omiso de un personaje, junto con límite de palabra en expresiones regulares

StackOverflow https://stackoverflow.com/questions/2902004

  •  04-10-2019
  •  | 
  •  

Pregunta

Estoy utilizando gsub en Ruby para formar una palabra en el texto en negrita. Estoy usando un límite de palabra con el fin de no hacer letras en otras palabras en negrita, pero estoy encontrando que ignora las palabras que tienen una cita después de ellos. Por ejemplo:

text.gsub(/#{word}\b/i, "<b>#{word}</b>")

text = "I said, 'look out below'"
word = below

En este caso la palabra a continuación no se pone en negrita. ¿Hay alguna forma de ignorar ciertos caracteres junto con un límite de palabra?

¿Fue útil?

Solución

Todo lo que se escape en el Regexp.new es un aspecto muy feo. Se podría simplificar en gran medida de que mediante el uso de una expresión regular literal:

word = 'below'
text = "I said, 'look out below'"

reg = /\b#{word}\b/i
text.gsub!(reg, '<b>\0</b>')

Además, se podría utilizar el modificador de forma gsub! directamente, a menos que la cadena tiene un alias en algún otro lugar en el código que no nos está mostrando. Por último, si se utiliza el único literal cadena entre comillas dentro de su llamada gsub, que no es necesario para escapar de la barra invertida.

Otros consejos

Sea muy cuidado con sus límites \b. He aquí por qué .

La sintaxis #{word} no funciona para expresiones regulares. Uso Regexp.new lugar:

word = "below"
text = "I said, 'look out below'"

reg = Regexp.new("\\b#{word}\\b", true)
text = text.gsub(reg, "<b>\\0</b>")

Tenga en cuenta que cuando se utiliza la picadura tiene que escapar a \b \\b, o se interpreta como un retroceso. Si word puede contener caracteres especiales de expresiones regulares, escapar de ella mediante Regexp.escape.

Además, mediante la sustitución de la cadena a <b>#{word}</b> puede cambiar la carcasa de la cadena: "abajo" se reemplazará a "por debajo". \0 corrige este mediante la sustitución de la palabra que se encuentra. Además, he añadido \\b al principio, que no quiere buscar " días " y termina con "sol días ".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top