Dado:
const textToFind = 'Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, ' const paragraph = 'Lorem Ipsum has been the industry's [standard](wwww.meh.com) dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.'Necesito salida:
Lorem Ipsum has been the industry's [standard](wwww.meh.com) dummy text ever since the 1500s,
es decir, haga coincidir textToFind en el paragraph y luego extráigalo.
Descubrí esta expresión regular para encontrar enlaces de descuento: /\[([^\]]+)\]\([^)"]+\)/g , pero no estoy seguro de qué más hacer después de eso.
textToFind se deriva del paragraph al principio, y lo necesito para calcular el ancho de cada línea, por lo que no estoy considerando modificar standard a algún identificador único (para reemplazarlo más tarde con el texto real), porque si el los caracteres cambian, entonces también lo hará el ancho.
Información adicional:
Estoy usando React Native Text
<Text onTextLayout={....} numberOfLines={x} /> para obtener las líneas representadas en un párrafo x , pero este texto no se ha convertido desde Markdown (si es así, los enlaces se pierden, ya que solo analiza texto puro, no View s, no Text properties, etc.)
Corrientemente:
Estoy pensando en cifrar el [plainText](url)
(por ejemplo reversePlainText().QueueShiftTwoCharacters() ),
y guarde este cifrado en paralelo
recordedLinks = Queue<Record<encryptedPlainText, originalUnparsedMarkdown>>()`y lo consulta en orden.
De esta manera, al pasar de [plainText](url) a texto sin formato encryptedPlainText (y casi perder la URL y el posicionamiento), podemos hacer coincidir los enlaces recordedLinks en el orden en que la pantalla representa cada una de estas líneas de texto rúnicas crípticas , darán los mensajes de texto sin formato encryptedPlainText . sus enlaces en forma FIFO.
Estableceré el enfoque "Pythonic" que tendría para este problema. A continuación describiré los pasos que seguiría:
(<link_match>, <word_match>, <start_index>)<start_index>text_to_find se puede encontrar dentro del paragraph actualizado, entonces para cada tripletext_to_find hot word con su versión similar a un enlace.Aquí está el código:
import re text_to_find = 'Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, ' paragraph = 'Lorem [Ipsum](lalala) has been the industry's [standard](www.meh.com) dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to [make](hello?) a type [specimen](yes) book.' # generate triple (<link_match>, <word_match>, <start_index>) lst = [(m.group(0), m.group(1), m.start(0)) for m in re.finditer(r'\[([^\]]+)\]\([^)"]+\)', paragraph)] # update paragraph and triple subtract = 0 for idx, (link, match, i) in enumerate(lst): paragraph = paragraph.replace(link, match, 1) lst[idx] = (link, match, i-1+subtract) subtract += len(match) - len(link) # update text with links if not paragraph.find(text_to_find)+1: print('no reference') else: for (link, match, i) in lst[::-1]: if i < len(text_to_find): text_to_find = text_to_find[:i+1] + link + text_to_find[i+1+len(match):] print(text_to_find) Si tiene más de un text_to_find en diferentes párrafos, puede almacenar la conversión de párrafo y la traducción de text_to_find en dos funciones diferentes y llamarlas dentro de un ciclo sobre párrafos y textos para que se encuentren en consecuencia.
La siguiente es una solución aproximada y lista. No asume caracteres especiales de expresión regular en textToFind (si los hay, se pueden escapar simplemente).
Se crea una expresión regular a partir de textToFind donde cada palabra tiene la opción de ser el texto del enlace de un enlace de descuento, por ejemplo, Ipsum se convierte en (?:Ipsum|\[Ipsum\]\([^)"]+\)) en la expresión regular cuerda.
const textToFind = 'Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, '; const paragraph = 'Lorem Ipsum has been the industry's [standard](wwww.meh.com) dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.' const regexString = textToFind.replace(/\w+/g, '(?:$&|\\[$&\\]\\([^)"]+\\))'); const match = paragraph.match(new RegExp(regexString, 'g')); console.log(match); Si explica cómo se usa textToFind para calcular el ancho de cada línea, es posible que se presente una solución más sólida.